Day129 | 灵神 | 二叉树 | 二叉树的堂兄弟节点II

2641.二叉树的堂兄弟节点II

2641. 二叉树的堂兄弟节点 II - 力扣(LeetCode)

思路:

笔者这道题就算告诉我要用层序遍历,后面我也没做出来…..

要从父节点思考子节点,而不是单纯从子节点下手

image-20250529201740792

以这个例子为例

要算第三层,就要考虑第二层,当我们还在遍历第二层的时候,就把第二层的节点存起来

然后遍历一次第二层节点得到 第三层节点的和 10+1+7=18

为什么要算和是多少呢?因为我们要知道4的左右孩子的值是多少就必须知道9的左右孩子的和

而我们把所有结点的和加起来以后,再减去 4的左右孩子的值,那剩下的不就是9的左右孩子的值吗

算一下就是 10+1+7=18,这是第三层节点的和 4的左右孩子和是11,9的是7

那么4的左右孩子的值就是 18-1-10=7,而9的左右孩子就是18-7=11了

所以要考虑父节点那一层

遍历一遍当前层结点算出和,再遍历一次进行赋值

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
public:
TreeNode *replaceValueInTree(TreeNode *root) {
vector<TreeNode *> q;
if(root==nullptr)
return root;
root->val=0;
q.push_back(root);
while(!q.empty())
{
vector<TreeNode*> next;
int sum=0;
for(auto t:q)
{
if(t->left)
{
next.push_back(t->left);
sum+=t->left->val;
}
if(t->right)
{
next.push_back(t->right);
sum+=t->right->val;
}
}
for(auto t:q)
{
int child_sum=(t->left ? t->left->val : 0) +
(t->right ? t->right->val : 0);
if(t->left)
t->left->val=sum-child_sum;
if(t->right)
t->right->val=sum-child_sum;
}
q=move(next);
}
return root;
}
};