力扣题目链接:https://leetcode.cn/problems/cousins-in-binary-tree-ii/
给你一棵二叉树的根 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) {
vector<pair<TreeNode*, TreeNode*>> v = {{root, nullptr}, }; // [, ...]
while (v.size()) {
int valSum = 0;
vector<pair<TreeNode*, TreeNode*>> nextV;
unordered_map<TreeNode*, int> originalVal;
for (auto&& [thisNode, broNode] : v) {
originalVal[thisNode] = thisNode->val;
valSum += thisNode->val;
if (thisNode->left) {
nextV.push_back({thisNode->left, thisNode->right});
}
if (thisNode->right) {
nextV.push_back({thisNode->right, thisNode->left});
}
}
for (auto&& [thisNode, broNode] : v) {
thisNode->val = valSum - thisNode->val - originalVal[broNode];
}
swap(v, nextV); // 这里不可:memmove(&v, &nextV, nextV.size());
}
return root;
}
};
# from collections import defaultdict
# # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def replaceValueInTree(self, root: TreeNode) -> TreeNode:
v = [(root, None)]
while v:
valSum = 0
originalVal = defaultdict(int)
nextV = []
for thisNode, broNode in v:
valSum += thisNode.val
originalVal[thisNode] = thisNode.val
if thisNode.left:
nextV.append((thisNode.left, thisNode.right))
if thisNode.right:
nextV.append((thisNode.right, thisNode.left))
for thisNode, broNode in v:
thisNode.val = valSum - thisNode.val - originalVal[broNode]
v = nextV
return root
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136066230