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

文章目录

  • 题目
  • 思路
  • 代码
  • 结果

题目

题目链接
给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。

如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。

请你返回修改值之后,树的根 root 。

注意,一个节点的深度指的是从树根节点到这个节点经过的边数。

示例 1:
【Leetcode】2641. 二叉树的堂兄弟节点 II_第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 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;  
    }
};

结果

【Leetcode】2641. 二叉树的堂兄弟节点 II_第2张图片

你可能感兴趣的:(练习题(记录做题想法),leetcode,算法,c++)