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

题目:

给定一个二叉树

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

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

进阶:

你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
 

示例:

117. 填充每个节点的下一个右侧节点指针 II_第1张图片

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]

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

两种方法:

递归

每次依据判断左右存在的结点来让next连接它们

注:递归为防止出现左边有结点无法连接右边的情况,所以先递归右子树,让右子树的子节点都连接好,这样cheak函数里的  if(root->next)return cheak(root->next) 就能真正起到左右串联的作用

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

    Node* connect(Node* root) {
        if(!root)return root;
        if(root->right){
            if(root->left)root->left->next=root->right;
            root->right->next=cheak(root->next);
        }
        if(root->left&&!root->right)root->left->next=cheak(root->next);
        connect(root->right);
        connect(root->left);
        return root;
    }
};

队列

直接利用队列层序遍历即可

注:用队列不太符合进阶,直接变简单题了...

class Solution {
public:
    Node* connect(Node* root) {
        if(!root)return root;
        queueque;
        que.push(root);
        while(!que.empty()){
            int size=que.size();
            while(size--){
                Node *node=que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                //判断是否是最右树
                if(size!=0){
                    node->next=que.front();
                }
            }
        }
        return root;
    }
};

新手上路 有不足麻烦指正 非常感谢!

你可能感兴趣的:(leetcode,递归法,队列,数据结构)