思路:和上道题的思路类似。但是,这里子树有可能残缺,故需要平行扫描父节点同层的节点,找到他们的左右子节点。
对于当前扫描的一个节点,因为要找到当前节点的下一个。而调用递归函数时,要不断向下递归,所以要先递归当前节点的右子树,然后再递归左子树。即代码中所表示的:
helper(root->right);
helper(root->left);
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right, Node* _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public:
Node* connect(Node* root) {
helper(root);
return root;
}
void helper(Node* root)
{
if(!root) return ;
Node* t=root->next;
while(t)
{
if(t->left)
{
t=t->left;
break;
}
if(t->right)
{
t=t->right;
break;
}
t=t->next;
}
if(root->left) root->left->next=root->right?root->right:t;
if(root->right) root->right->next=t;
helper(root->right);
helper(root->left);
}
};