leetcode第一刷_Populating Next Right Pointers in Each Node II

很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路。做法依旧是每次找到一层的起点,然后一层一层的走。

假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之间的链接也简单,直接找相应父亲的左右孩子就可以。

一般二叉树时,起点应该是上一层第一个有孩子节点的左孩子,或者没有左孩子时。是他的右孩子。

为了能在孩子层中不断链接,我们必须保存当孩子层的前一个节点,当当前层找到一个节点有孩子,就接到这个pre节点后面,然后更新pre节点的指向。

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(root == NULL)    return;
        TreeLinkNode *beginNode = root, *leftNode, *pre;
        while(beginNode){
            leftNode = beginNode;
            pre = NULL;
            beginNode = NULL;
            while(leftNode){
                if(leftNode->left&&leftNode->right){
                    leftNode->left->next = leftNode->right;
                    if(pre)    pre->next = leftNode->left;
                    if(!beginNode)  beginNode = leftNode->left;
                    pre = leftNode->right;
                }else if(leftNode->left){
                    if(pre)    pre->next = leftNode->left;
                    if(!beginNode)  beginNode = leftNode->left;
                    pre = leftNode->left;
                }else if(leftNode->right){
                    if(pre)    pre->next = leftNode->right;
                    if(!beginNode)  beginNode = leftNode->right;
                    pre = leftNode->right;
                }
                leftNode = leftNode->next;
            }
        }
    }
};


posted @ 2017-06-17 10:36  zsychanpin  阅读(154)  评论(0编辑  收藏  举报