您的位置:首页 > Web前端 > Node.js

LeeCode_Populating Next Right Pointers in Each Node II

2014-06-22 20:41 423 查看
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


题目如上所示,这题实在I上进行的追问,第一题提交的太快,导致这道题大意了,原来想用递归的方法求解,但是没有清楚解的扩展方向,闲话不说直接上图:



代码如下:
class Solution {
public:
void connect(TreeLinkNode *root) {
TreeLinkNode *pLeftMost=root;
while (pLeftMost!=NULL){
TreeLinkNode *ptemp=pLeftMost;
while (ptemp!=NULL){
connectToNext(ptemp);
ptemp=ptemp->next;
}
pLeftMost=  findLeftMost(pLeftMost);
}
pLeftMost = root;

while (pLeftMost!=NULL){
TreeLinkNode *tep=pLeftMost;
while (tep!=NULL)
{
cout<<tep->val<<" ";
tep=tep->next;
}
cout<<"# ";
pLeftMost=  findLeftMost(pLeftMost);
}

}
TreeLinkNode *findLeftMost(TreeLinkNode *preLeftMost){
while (preLeftMost!=NULL){
if(preLeftMost->left!=NULL)
{
return preLeftMost->left;
}
if (preLeftMost->right!=NULL)
{
return preLeftMost->right;
}
preLeftMost=preLeftMost->next;
}
return NULL;
}
void connectToNext(TreeLinkNode *root){
if (root==NULL)
{
return;
}

TreeLinkNode *pSet=root->left;
TreeLinkNode *pSetNext=NULL;

//左儿子节点不空
if (pSet!=NULL){
//如果当前节点的左右儿子都不空,则设左儿子的next节点为右儿子
//同时更改需要设置next的节点为当前节点的右儿子
if(root->right!=NULL){
pSet->next=root->right;
pSet=root->right;
}
}
else{
//左儿子节点为空,设需要更改next域的节点为右儿子
pSet=root->right;
}

//当前节点的左右儿子都为空
if (pSet==NULL)
{
/*connectToNext(root->next);*/
return;
}

//find pSet's next
TreeLinkNode *ptemp=root->next;
while (ptemp!=NULL){
if (ptemp->left!=NULL){
pSetNext=ptemp->left;
break;
}
if (ptemp->right!=NULL){
pSetNext=ptemp->right;
break;
}
ptemp=ptemp->next;
}
pSet->next=pSetNext;
/*  connectToNext(root->next);*/
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: