117. 填充每个节点的下一个右侧节点指针 II

2019-12-27

11:21:54

解法1:DFS 递归遍历

参考:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/solution/c-o1kong-jian-jian-ji-di-gui-by-qqqun902025048/

解题思路:

对于任意一次递归,只考虑如何设置子节点的 next 属性,分为三种情况:
没有子节点:直接返回
有一个子节点:将这个子节点的 next 属性设置为同层的下一个节点,即为 root.next 的最左边的一个节点,如果 root.next 没有子节点,则考虑 root.next.next,依次类推
有两个节点:左子节点指向右子节点,然后右子节点同第二种情况的做法
注意递归的顺序需要从右到左

 

 

 

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
    Node* connect(Node* root) {
        Node* rot = root;
        if(rot != NULL && (rot->left || rot->right)){
            if(rot->left && rot->right){
                rot->left->next = rot->right;
            }
            Node* node = rot->right ? rot->right : rot->left;
            Node* head = rot->next;
            while(head != nullptr && !(head->left || head->right)){
                head = head->next;
            }
            node->next = head ? (head->left ? head->left : head->right) : nullptr;
            connect(root->right);//这里一定是右子节点先遍历
            connect(root->left);
        }
        return rot;
    }
};
posted @ 2019-12-27 11:24  JasonPeng1  阅读(216)  评论(0编辑  收藏  举报