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; } };