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域来实现下层的操作,说的有点拗口,没关系,看个图就明了了。


接下来:


继续:


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

//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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值