Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่างผลรวมของตำแหน่งคี่และโหนดตำแหน่งของไบนารีทรีใน Java


คำชี้แจงปัญหา

ด้วยไบนารีทรีที่กำหนด ให้เขียนโปรแกรมเพื่อค้นหาความแตกต่างระหว่างผลรวมของโหนดที่ตำแหน่งคี่และตำแหน่งคู่ สมมติว่ารูทที่ระดับ 0, ตำแหน่งคี่, ลูกซ้าย/ขวาของรูทที่ระดับ 2, ลูกซ้ายที่ตำแหน่งคี่ และลูกขวาที่ตำแหน่งคู่เป็นต้น

ตัวอย่าง

<ก่อนหน้า> 5 / \ 2 6 / \ \ 1 4 8 / / \ 3 7 9 ผลรวมของโหนดในตำแหน่งคี่=5 + 2 + (1 + 8) + (3 + 9)=5 + 2 + 9 + 12=28ผลรวมของโหนดที่ระดับคู่=0 + 6 + 4 + 7=17ความแตกต่าง =11

วิธีแก้ปัญหา

ใช้ระดับการสั่งซื้อ Traversal ในระหว่างการข้ามผ่าน ให้ทำเครื่องหมายองค์ประกอบแรกเป็นตำแหน่งคี่ จากนั้นสลับไปที่แม้เมื่อพบองค์ประกอบใหม่แล้วจึงเปิดใหม่เป็นตำแหน่งคี่

ตัวอย่าง

ต่อไปนี้เป็นโปรแกรมใน Java เพื่อค้นหาผลลัพธ์ที่ต้องการ

นำเข้า java.util.LinkedList;โหนดคลาส { ข้อมูล int; โหนดซ้าย, ขวา; โหนด (ข้อมูล int) { this.data =data; this.left =this.right =null; }} JavaTester คลาสสาธารณะ { โหนดคงที่สาธารณะ getTree () { Node root =โหนดใหม่ (5); root.left =โหนดใหม่ (2); root.right =โหนดใหม่ (6) root.left.left =โหนดใหม่ (1); root.left.right =โหนดใหม่ (4) root.left.right.left =โหนดใหม่ (3); root.right.right =โหนดใหม่ (8) root.right.right.right =โหนดใหม่ (9); root.right.right.left =โหนดใหม่ (7) ส่งคืนรูต; } ความแตกต่าง int สาธารณะแบบคงที่ (LinkedList คิว){ if(queue.isEmpty()) คืนค่า 0; int ผลรวม =0; int oddSum =0; ในขณะที่ (จริง) { โหนด int =Queue.size (); ถ้า (โหนด ==0) แตก; บูลีน isOdd =จริง; ในขณะที่ (โหนด> 0){ โหนดโหนด =Queue.peek (); ถ้า (isOdd) oddSum +=node.data; อื่นผลรวม +=node.data; คิว. ลบ (); โหนด--; if(node.left !=null) queue.add(node.left); if(node.right !=null) queue.add(node.right); isOdd =!isOdd; } } คืนค่า oddSum - evenSum; } โมฆะคงที่สาธารณะ main(String args[]){ Node tree =getTree(); LinkedList คิว =ใหม่ LinkedList(); Queue.add(ต้นไม้); System.out.println(ความแตกต่าง(คิว)); }}

ผลลัพธ์

11