ให้เราพิจารณาว่าเรามีโหนดรูทของไบนารีทรี ภารกิจคือการค้นหาและส่งคืนผลรวมของการเอียงของทุกโหนด
เอียง ของไบนารีทรีไม่ได้เป็นเพียงการสร้างไบนารีทรีโดยการค้นหาความแตกต่างที่แน่นอนของโหนดย่อยในทรีย่อยด้านซ้ายและทรีย่อยด้านขวาในแต่ละระดับ ในระดับใดระดับหนึ่ง โหนดที่ไม่มีโหนดย่อย เราเพียงแค่เอียงโดยแทนที่โหนดนั้นเป็นศูนย์
ตัวอย่าง
ป้อนข้อมูล
เอาต์พุต:15
คำอธิบาย: การหาความเอียงในทุกระดับของไบนารีทรีที่กำหนด
ความเอียงของโหนด 3 =0
ความเอียงของโหนด 5 =0
ความเอียงของโหนด 7 =0
ความเอียงของโหนด 2 =abs(3-5)=2
ความเอียงของโหนด 9 =abs(0-7)=7
ความเอียงของโหนด 4 =abs((3+5+2)- (9+7))=6
ผลรวมของการเอียงของโหนดทั้งหมดคือ =2+7+6=15
แนวทางในการแก้ปัญหานี้
วิธีง่ายๆ ในการแก้ปัญหานี้คือการใช้การข้ามผ่าน Post Order Breadth First Search
ขณะสำรวจต้นไม้ไบนารี เราจะพยายามหาผลรวมของโหนดทั้งหมดของทรีย่อยทางซ้าย และทรีย่อยทางขวา เมื่อพบผลรวมแล้ว เราจะพบความเอียงของโหนดทั้งหมดโดยการคำนวณผลต่างสัมบูรณ์ของผลรวมด้านซ้ายและผลรวมด้านขวาของทรีย่อย
- ใช้ไบนารีทรี ซึ่งจะเป็นอินพุต
- ฟังก์ชันจำนวนเต็ม sumNodes(treenode*node) รับโหนดรูทของทรีและคืนค่าผลรวมของทรีย่อยด้านซ้ายและทรีย่อยด้านขวา
- ฟังก์ชันจำนวนเต็ม findTilt(treenode*root) รับโหนดรูทเป็นพารามิเตอร์อินพุตและส่งกลับผลรวมของการเอียงของโหนดทั้งหมด
ตัวอย่าง
#include<iostream>
using namespace std;
struct treenode {
int data;
treenode * left;
treenode * right;
};
struct treenode * createNode(int d) {
struct treenode * root = new treenode;
root -> data = d;
root -> left = NULL;
root -> right = NULL;
return root;
}
int sumNodes(treenode * root, int & sum) {
if (root == NULL) return 0;
int lsum = sumNodes(root -> left, sum);
int rsum = sumNodes(root -> right, sum);
sum += abs(lsum - rsum);
return lsum + rsum + root -> data;
}
int findTilt(treenode * root) {
int sum = 0;
if (root == NULL) {
return 0;
}
sumNodes(root, sum);
return sum;
}
int main() {
struct treenode * root = NULL;
root = createNode(4);
root -> left = createNode(2);
root -> right = createNode(9);
root -> left -> right = createNode(5);
root -> left -> left = createNode(3);
root -> right -> right = createNode(7);
cout << findTilt(root) << endl;
return 0;
} การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
ผลลัพธ์
15
ในไบนารีทรีที่กำหนด ผลรวมของการเอียงของโหนดทั้งหมดในทุกระดับของทรีคือ 15