层序遍历,LeetCode 2641. 二叉树的堂兄弟节点 II

目录

一、题目

1、题目描述

2、接口描述

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

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

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

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

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

2、接口描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* replaceValueInTree(TreeNode* root) {
        
    }
};

3、原题链接

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


二、解题报告

1、思路分析

层序遍历,累加层和,然后再次遍历这一层进行修改即可

手写队列的话会方便很多

2、复杂度

时间复杂度:O(n) 空间复杂度:O(n)

3、代码详解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
typedef TreeNode Node;
typedef pair PNN;
#define mkp make_pair
PNN q[100010];
int f, b;
    TreeNode* replaceValueInTree(TreeNode* root) {
        f = b = 0, q[b++] = mkp(root, nullptr);
        while(b - f){
            int s = 0, ed = b, st = f;
            while(f < ed){
                auto [l , r] = q[f++];
                if(l && (l -> left || l -> right))
                    q[b++] = mkp((l->left ? l->left : nullptr), (l->right ? l->right : nullptr));
                if(r && (r -> left || r -> right))
                    q[b++] = mkp((r->left ? r->left : nullptr), (r->right ? r->right : nullptr));
                if(l) s += l -> val;
                if(r) s += r -> val;
            }
            while(st < ed)
            {
                auto [l , r] = q[st++];
                int t = s;
                if(l) t -= l -> val;
                if(r) t -= r -> val;
                if(l) l -> val = t;
                if(r) r -> val = t;
            }
        }
        return root;
    }
};

你可能感兴趣的:(leetcode每日一题,算法,c++,数据结构,leetcode)