LeetCode 面试经典150题 [68/150 填充每个节点的下一个右侧节点指针II]


avatar
GuoYulong 2024-07-30 111

题目描述

给定一个二叉树:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。
示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

个人C++解答


看着灵神的题解写的,自己的话还是写不出递归来,菜就多练
①用DFS,用辅助数组记录深度和左节点,可以理解为每个深度只记录一个左节点,然后查询到右节点的时候让左节点指向右节点,由于开始的时候,所有的next节点均为null那么只需改变存在右边节点的即可。
②用BFS,遍历,将每一层都用next连接起来,但实际写起来感觉也很麻烦,直接复制灵神代码了;
③BFS+链表,依旧是灵神,

GYL

DFS

class Solution {
    vector<Node*> pre;
public:
    Node* connect(Node* root) {
        dfs(root,0);
        return root;
    }

    void dfs(Node* node, int depth) {
        if(node == nullptr){
            return ;
        }
        if(depth == pre.size()){
            pre.push_back(node);
        }else{
            pre[depth]->next = node;
            pre[depth] = node;
        }
        dfs(node->left,depth+1);
        dfs(node->right,depth+1);
    }
};

BFS

class Solution {
public:
    Node* connect(Node* root) {
        if (root == nullptr)
            return nullptr;
        vector<Node*> q = {root};
        while(!q.empty()){
            vector<Node*> nxt;
            for (int i = 0; i < q.size(); i++) {
                Node* node = q[i];
                if (i) {
                    q[i - 1]->next = node;
                }
                if (node->left) {
                    nxt.push_back(node->left);
                }
                if (node->right) {
                    nxt.push_back(node->right);
                }
            }
            q = move(nxt);
        }
        return root;
    }
};

相关阅读

注意!!!

新增会员中心页面,方便管理个人账户,充值功能暂不开启,请勿为本网站进行任何充值活动!!!

通知!!!

① 过年好!!!拖更几个月了已经,年后继续更新!!