[leetcode]Populating Next Right Pointers in Each Node II

         1
       /  
      2    3
     /     
    4   5    7


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


用O(1)的空间

那就利用next节点,一层一层的来遍历好了
首先是root,我们把它的left和right连起来
然后root切换到下一层

然后遍历下一层的每个节点(因为next连了的
再分别把他们的left,right什么的连起来

用两个变量就ok了
一个prev记录当前层前一节点是啥(用来连接的
一个next记录下一层的开始(用户切换到下一层

/**
 * 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) {
        TreeLinkNode* prev = nullptr;
        TreeLinkNode* next = nullptr;
        
        while(root) {
            prev = nullptr;
            next = nullptr;
            //if(next == nullptr) next = root->left ? root->left : root->right;
            for( ; root ; root = root->next) {
                if(next == nullptr) 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;
        }
    }
};

注释的那一句,开始一位本来是一样的嘛,但是仔细一想,我第一个left可能是空啊,当前层的第一个是叶子节点,但是他的兄弟不是啊

所以要写到循环里面,找到第一个有left或者right的节点,然后把left或者right(left优先)赋值给next

 
原文地址:https://www.cnblogs.com/x1957/p/3521212.html