สมมติว่าเรามีรากของต้นไม้แบบทวิภาค ระดับของรากคือ 1 ลูกคือ 2 ไปเรื่อยๆ ต้องคืนระดับ X ที่เล็กที่สุด ที่ผลรวมค่าโหนดในระดับนั้นเป็นค่าสูงสุด
ตัวอย่าง ต้นไม้ดังภาพ ผลลัพธ์: 2

ระดับ 1 ผลรวม = 1, ระดับ 2 ผลรวม = 7 + 0 = 7, ระดับ 3 ผลรวม = 7 + (-8) = -1 ดังนั้นระดับ 2 สูงสุด
ขั้นตอนการแก้ปัญหา (BFS Level Order Traversal)
level := 1, sum := ค่าของ r, ansLevel := level, ansSum := sum- กำหนดคิว
qใส่โหนดr whileqไม่ว่าง:capacity := ขนาดของ q- เพิ่ม
levelขึ้น 1,sum := 0 whilecapacityไม่ใช่ 0:node := โหนดหน้าของ qลบออก- ถ้าลูกขวาของ
nodeมีอยู่:sum += ค่าลูกขวาใส่ลูกขวาเข้าq - ถ้าลูกซ้ายของ
nodeมีอยู่:sum += ค่าลูกซ้ายใส่ลูกซ้ายเข้าq - ลด
capacityลง 1
- ถ้า
ansSum < sum:ansSum := sum, ansLevel := level
- คืน
ansLevel
ตัวอย่างโค้ด (C++)
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) {
val = data;
left = NULL;
right = NULL;
}
};
void insert(TreeNode **root, int val) {
queue<TreeNode*> q;
q.push(*root);
while(q.size()) {
TreeNode *temp = q.front();
q.pop();
if(!temp->left) {
if(val != NULL)
temp->left = new TreeNode(val);
else
temp->left = new TreeNode(0);
return;
} else {
q.push(temp->left);
}
if(!temp->right) {
if(val != NULL)
temp->right = new TreeNode(val);
else
temp->right = new TreeNode(0);
return;
} else {
q.push(temp->right);
}
}
}
TreeNode *make_tree(vector<int> v) {
TreeNode *root = new TreeNode(v[0]);
for(int i = 1; i < v.size(); i++) {
insert(&root, v[i]);
}
return root;
}
class Solution {
public:
int maxLevelSum(TreeNode* r) {
int level = 1, sum = r->val;
int ansLevel = level, ansSum = sum;
queue <TreeNode*> q;
q.push(r);
while(!q.empty()) {
int capacity = q.size();
level++;
sum = 0;
while(capacity--) {
TreeNode* node = q.front();
q.pop();
if(node->right) {
sum += node->right->val;
q.push(node->right);
}
if(node->left) {
sum += node->left->val;
q.push(node->left);
}
}
if(ansSum < sum) {
ansSum = sum;
ansLevel = level;
}
}
return ansLevel;
}
};
int main() {
vector<int> v = {1,7,0,7,-8,NULL,NULL};
TreeNode *root = make_tree(v);
Solution ob;
cout << ob.maxLevelSum(root);
}
อินพุต
[1,7,0,7,-8,null,null]
เอาต์พุต
2