码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode:Populating Next Right Pointers in Each Node II

时间:2015-01-02 18:45:09      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

  • You may only use constant extra space.

 

For example,
Given the following binary tree,

         1
       /        2    3
     / \        4   5    7

 

After calling your function, the tree should look like:

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

分析:此题是Populating Next Right Pointers in Each Node的升级版,去掉了是perfect binary tree的条件,去掉这个条件带来的影响是我们必须查找节点p孩子的next和下一层的head节点,迭代代码如下:
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(root == NULL) return;
        
        TreeLinkNode *head = root;
        while(head){
            TreeLinkNode *cur = head;
            while(cur){
                TreeLinkNode *next = NULL, *p;
                //find next node
                for(p = cur->next; p && p->left == NULL && p->right == NULL; p = p->next);
                if(p == NULL) next = NULL;
                else next = p->left?p->left:p->right;
                //level link
                if(cur->left){
                    cur->left->next = cur->right?cur->right:next;
                }
                if(cur->right)
                    cur->right->next = next;
                cur = cur->next;
            }
            //find next head
            TreeLinkNode *q;
            for(q = head; q && q->left == NULL && q->right == NULL; q = q->next);
            if(q == NULL) head = NULL;
            else head = q->left?q->left:q->right;
        }
    }
};

上述代码太繁琐,在上面代码的基础上,我们进行简化,实际上在每一层,我们只需维护两个变量,一个next指向下一层的第一个node,一个prev表示同一层的前一个节点。代码如下:

class Solution {
public:
    void connect(TreeLinkNode *root) {
        while (root) {
            TreeLinkNode * next = nullptr; // the first node of next level
            TreeLinkNode * prev = nullptr; // previous node on the same level
            for (; root; root = root->next) {
                if (!next) next = root->left ? root->left : root->right;
                if (root->left) {
                    if (prev) prev->next = root->left;
                    prev = root->left;
                }
                if (root->right) {
                    if (prev) prev->next = root->right;
                    prev = root->right;
                }
            }
            root = next; // turn to next level
        }
    }
};

 

Leetcode:Populating Next Right Pointers in Each Node II

标签:

原文地址:http://www.cnblogs.com/Kai-Xing/p/4198620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!