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

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了

所以要考虑父节点那一层

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

完整代码:

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值