Leetcode: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

分析:此题是level-order traversal的变形,与level-order traversal不同的是该题要求constant space。一般的level-order traversal用一个容器保存上一层的节点是O(n)space complexity,所以这里不同直接照搬。分析此题,一个节点p的左孩子的next是节点p的右孩子,p的节点的右孩子的next是p的next节点的左孩子,由这个我们便可以通过只维护节点p来完成populate。时间复杂度为O(n),空间复杂度为O(1)。代码如下:
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(root == NULL) return;
        
        TreeLinkNode *head = root;//point to head of every level
        while(head->left && head->right){
            TreeLinkNode *cur = head;//iterate through each node in a level
            while(cur){
                cur->left->next = cur->right;
                cur->right->next = cur->next?cur->next->left:NULL;
                cur = cur->next;
            }
            head = head->left;//update head to left child of previous head
        }
    }
};

 


posted on 2015-01-02 16:24  Ryan-Xing  阅读(199)  评论(0编辑  收藏  举报