题目描述
Follow up for problem “Populating Next Right Pointers in Each Node”.
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
You may only use constant extra space.
For example,
Given the following binary tree,
1
/ \
2 3
/ \ \
4 5 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL
如果借助辅助空间可以直接按照层序遍历来做,如果不借助辅助空间可以利用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) {
if(root==NULL)
return;
while(root!=NULL) //遍历完所有的层结束
{
TreeLinkNode* temp=root;
while(root!=NULL){ //遍历完一层结束
if(root->left&&root->right) //如果左右孩子都有将左右孩子连起来
{
root->left->next=root->right;
}
if(root->left!=NULL&&root->right==NULL) //只有左孩子的情况
{
TreeLinkNode* temp2=root->next;
while(temp2){ //一直到找到可以连接的下一个点位置
if(temp2->left){
root->left->next=temp2->left;
break;
}
if(temp2->right){
root->left->next=temp2->right;
break;
}
temp2=temp2->next;
}
root=temp2; //root更新为已连接的孩子的父节点
continue;
}
if(root->right!=NULL) //有右孩子的情况包括左右孩子都有
{
TreeLinkNode* temp2=root->next;
while(temp2){ //寻找下一个连接的点.
if(temp2->left)
{
root->right->next=temp2->left;
break;
}
if(temp2->right){
root->right->next=temp2->right;
break;
}
temp2=temp2->next;
}
root=temp2;
continue;
}
root=root->next; //左右孩子都没有直接更新到右边一个节点
}
while(temp) //找到下一层最左边的节点,继续遍历下一层.
{
if(temp->left){
temp=temp->left;
break;
}
else if(temp->right)
{
temp=temp->right;
break;
}
temp=temp->next;
}
root=temp;
}
}
};