文章目录
- 题目
- 思路
- 代码
- 结果
题目
题目链接
给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。
如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。
请你返回修改值之后,树的根 root 。
注意,一个节点的深度指的是从树根节点到这个节点经过的边数。
示例 1:
输入:root = [5,4,9,1,10,null,7]
输出:[0,0,0,7,7,null,11]
解释:上图展示了初始的二叉树和修改每个节点的值之后的二叉树。
- 值为 5 的节点没有堂兄弟,所以值修改为 0 。
- 值为 4 的节点没有堂兄弟,所以值修改为 0 。
- 值为 9 的节点没有堂兄弟,所以值修改为 0 。
- 值为 1 的节点有一个堂兄弟,值为 7 ,所以值修改为 7 。
- 值为 10 的节点有一个堂兄弟,值为 7 ,所以值修改为 7 。
- 值为 7 的节点有两个堂兄弟,值分别为 1 和 10 ,所以值修改为 11 。
示例 2:
输入:root = [3,1,2]
输出:[0,0,0]
解释:上图展示了初始的二叉树和修改每个节点的值之后的二叉树。
- 值为 3 的节点没有堂兄弟,所以值修改为 0 。
- 值为 1 的节点没有堂兄弟,所以值修改为 0 。
- 值为 2 的节点没有堂兄弟,所以值修改为 0 。
提示:
树中节点数目的范围是 [1, 105] 。
1 <= Node.val <= 104
思路
使用层序遍历法模拟即可 ,使用队列来进行节点存储
代码
class Solution {
public:
TreeNode* replaceValueInTree(TreeNode* root) {
if (!root) return nullptr;
root->val = 0;
queue<TreeNode*> q;
q.push(root);
int pre = 0;
while (!q.empty()) {
int size = q.size();
int sum = 0;
for (int i = 0; i < size; i++) {
TreeNode* cur = q.front();
q.pop();
cur->val = pre - cur->val;
TreeNode* left = cur->left;
TreeNode* right = cur->right;
int val = (left ? left->val : 0) + (right ? right->val : 0);
if (left) {
q.push(left);
left->val = val;
}
if (right) {
q.push(right);
right->val = val;
}
sum += val;
}
pre = sum;
}
return root;
}
};