当前位置:网站首页>LeetCode 116. 填充每个节点的下一个右侧节点指针

LeetCode 116. 填充每个节点的下一个右侧节点指针

2022-04-23 20:23:00 亡于灬

116. 填充每个节点的下一个右侧节点指针

1)题目描述

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

img

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

示例 2:

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

提示:

  • 树中节点的数量在 [0, 2^12 - 1] 范围内
  • -1000 <= node.val <= 1000

2)分析

递归。

首先考虑根结点为空,直接返回空指针。

当根结点不为空的时候,考虑根结点有叶子结点。那么左叶子结点的next指向右叶子结点。

考虑当前根结点存在父结点,那么当前根结点一定有兄弟结点(参照FigureB中的2),那么当前根结点的右叶子结点(参照FigureB中的5)的next就应该指向当前根结点next所指结点(参照FigureB中的3)的左叶子结点(参照FigureB中的6)。

3)C++代码

/* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {} Node(int _val, Node* _left, Node* _right, Node* _next) : val(_val), left(_left), right(_right), next(_next) {} }; */

class Solution {
    
public:
    Node* connect(Node* root) {
    
        if(!root)
            return NULL;
        if(root->left){
    
            root->left->next=root->right;
            if(root->next)
                root->right->next=root->next->left;
        }

        connect(root->left);
        connect(root->right);
        return root;
    }
};

版权声明
本文为[亡于灬]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_38342510/article/details/124360289