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

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

题目:填充每个节点的下一个右侧节点指针

    给定一个 完全二叉树,二叉树定义如下:

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

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

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

 

实例:

输入:root = [1,2,3,4,5,6,7]

输出:[1,#,2,3,#,4,5,6,7,#]

 

题解:

1. BFS

    利用BFS,层次遍历每一层,当前节点的next等于队列中的下一个节点

    时间复杂度:10%, 空间复杂度:10%

class Solution {
        public Node connect(Node root) {
            Queue<Node> queue=new LinkedList<>();
            if(root == null) return root;

            queue.add(root);

            while (!queue.isEmpty())
            {
                 int l=queue.size();
                 for(int i=0;i<l;i++)
                 {
                     Node temp=queue.poll();
                     if(i!=l-1)
                     {
                         temp.next=new Node();
                         temp.next=queue.peek();
                     }
                     else
                         temp.next=null;

                     if(temp.left!=null)
                         queue.add(temp.left);
                     if(temp.right!=null)
                        queue.add(temp.right);
                 }
            }
            return root;
        }
    }

 

2. 递归

    左节点.next=父节点.right

    右节点.next=父节点.next.left

class Solution {
        public void dfs(Node root)
        {
            if(root==null || root.left==null) return;
            root.left.next=root.right;
            if(root.next!=null)
                root.right.next=root.next.left;

            dfs(root.left);
            dfs(root.right);
        }
        public Node connect(Node root) {
            if(root==null) return root;

            root.next=null;
            dfs(root);

            return root;
        }
    }

 

posted @ 2021-12-15 13:11  言思宁  阅读(23)  评论(0编辑  收藏  举报