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


昨天晚上做完这道题,解法见http://blog.csdn.net/shiquxinkong/article/details/17724151,翻来覆去想别的办法,突然想到在说明这个题的时候说到“同层”的概念,就想到next就正好是串联层的关键,而下层恰好可以利用上层来实现,那么我们就可以利用已经设置好的上层的next域来实现下层的操作,说的有点拗口,没关系,看个图就明了了。

Populating Next Right Pointers in Each Node问题另一种解法_第1张图片

接下来:

Populating Next Right Pointers in Each Node问题另一种解法_第2张图片

继续:

Populating Next Right Pointers in Each Node问题另一种解法_第3张图片

好了,这棵树的连接完成了,还是建议自己画一下,体会下过程。

//code

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
    void connect(TreeLinkNode *root) {
        //NULL or has no children, nothing to do.
        if(root == NULL || root->left == NULL) 
          return;
        TreeLinkNode *p = root;
        while(p != NULL)
        {
          p->left->next = p->right;
          if(p->next)
          p->right->next = p->next->left;
          p = p->next;
        }
        connect(root->left);
    }
};

这个问题的非递归程序如下:

class Solution {
public:
    void connect(TreeLinkNode *root) {
        //NULL or has no children, nothing to do.
        if(root == NULL || root->left == NULL) 
          return;
        while(root){
        if(root->left == NULL) return;
        TreeLinkNode *p = root;
        while(p != NULL)
        {
          p->left->next = p->right;
          if(p->next)
          p->right->next = p->next->left;
          p = p->next;
        }
        root = root->left;
        }
    }
};
后记:在写完这个code后还是有点小兴奋,百度了下这个问题的解法,发现了原来这个解法还是已经存在了的,可见<<圣经>>里说的话还是有道理的,里面讲到“已有的事后必再有,已行的事后必再行,日光之下并无新事”,一切皆属空虚。

附:http://leetcode.com/2010/03/first-on-site-technical-interview.html

你可能感兴趣的:(Algorithm,LeetCode,递归,tree,二叉树)