116. Populating Next Right Pointers in Each Node

 

Given a binary tree

    struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
    }

 

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

 

For example,
Given the following perfect binary tree,

         1
       /  \
      2    3
     / \  / \
    4  5  6  7

 

After calling your function, the tree should look like:

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \  / \
    4->5->6->7 -> NULL


题目的意思就是把二叉树的每一层节点都用 next 指针连接起来:

 

而且题目说了,输入是一棵「完美二叉树」,形象地说整棵二叉树是一个正三角形,除了最右侧的节点 next 指针会指向 null,其他节点的右侧一定有相邻的节点。

这道题怎么做呢?把每一层的节点穿起来,是不是只要把每个节点的左右子节点都穿起来就行了?

我们可以模仿上一道题,写出如下代码:

 
Node connect(Node root) {
if (root == null || root.left == null) {
return root;
}
 
root.left.next = root.right;
 
connect(root.left);
connect(root.right);
 
return root;
}

这样其实有很大问题,再看看这张图:

 

节点 5 和节点 6 不属于同一个父节点,那么按照这段代码的逻辑,它俩就没办法被穿起来,这是不符合题意的。

回想刚才说的,二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情,但是如果只依赖一个节点的话,肯定是没办法连接「跨父节点」的两个相邻节点的。

那么,我们的做法就是增加函数参数,一个节点做不到,我们就给他安排两个节点,「将每一层二叉树节点连接起来」可以细化成「将每两个相邻节点都连接起来」:

class Solution {
public:
    void connect_two(Node* root1, Node* root2){
        if(root1 == NULL || root2==NULL) return;
        root1->next = root2;
        connect_two(root1->left,root1->right);
        connect_two(root2->left,root2->right);
        connect_two(root1->right,root2->left);
        
    }
    Node* connect(Node* root) {
        if(root == NULL) return NULL;
        connect_two(root->left,root->right);
        return root;
    }
};

 





-------------old-----------------

默认每个节点的next 都是空。
2层循环,第一层循环是层数,用level_start控制,
第二层循环,循环每层的每个节点,来构建next 指针,
构建next指针时,有3种情况:1 左指针指向右指针
2 右指针不是当层最末尾的指针,右指针指向父亲节点next的左指针。
3
右指针是当层最末尾的指针,不用处理,因为默认每个节点的next都是指向null的。

 1 public class Solution {
 2     public void connect(TreeLinkNode root) {
 3         TreeLinkNode level_start=root;
 4         while(level_start!=null){
 5             TreeLinkNode cur=level_start;
 6             while(cur!=null){
 7                 if(cur.left!=null) cur.left.next=cur.right;
 8                 if(cur.right!=null && cur.next!=null) cur.right.next=cur.next.left;
 9                 
10                 cur=cur.next;
11             }
12             level_start=level_start.left;
13         }
14     }
15 }

 

posted @ 2017-11-04 21:40  乐乐章  阅读(134)  评论(0编辑  收藏  举报