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

LeetCode 116 Populating Next Right Pointers in Each Node 解题报告

2015-03-30 20:44 741 查看
Populating Next Right Pointers in Each Node

Total Accepted: 44163 Total Submissions: 122231

Given a binary tree

struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}


Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

You may only use constant extra space.
You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).


For example,

Given the following perfect binary tree,

1
/  \
2    3
/ \  / \
4  5  6  7


After calling your function, the tree should look like:

1 -> NULL
/  \
2 -> 3 -> NULL
/ \  / \
4->5->6->7 -> NULL


/*

*本题是将一颗完美二叉树每一层用一个next指针连接起来,并且最右侧的节点指向NULL。我的思路是,先用循环把右侧的所有next指针设为NULL,然后使用两个指针,一个表示当前节点,另一个表示指向当前节点的前一个节点

然后按层,一层一层的把next指针都填充完毕。

一开始prev指向1,cur指向2。我们填充next指针的代码放入一个循环中,分为3种情况判断

1:当cur指针是prev的左孩子时,这个时候只需将cur->next 指向prev->right即可。然后使用cur=cur->next把cur指针移向下一个节点。

2:当cur指针是右孩子,而且cur->next不为NULL时,这个时候就是cur是prev的右孩子,但是不在最右侧。这种情况只需把cur->next指向prev->next->left就可以了。然后把cur和prev都向next移动,指向下一个节点

3:其他情况也就是cur是最右侧的节点,这时候需要判断cur是否为最后一个节点,如果是的话就退出循环,如果不是,则将cur和prev都指向下一层的第一个节点。

我们使用了cnt表示当前是第几层,每执行到这个判断代码段的时候,我们把cnt自增,表示到下一层去。通过cnt的大小我们就可以通过循环找到下一层的第一个节点

*/

/**
* 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)
{
return;
}
TreeLinkNode *cur = root;
TreeLinkNode *prev = root;
int cnt = 0;
while(cur)
{
cur->next = NULL;
cur = cur->right;
}
if(root->left)
cur = root->left;
else
return;
while(true)
{
if(cur == prev->left)
{
cur->next = prev->right;
cur = cur->next;
}
else if(cur == prev->right && prev->next != NULL)
{
cur->next = prev->next->left;
cur = cur->next;
prev = prev->next;
}
else
{
if(cur->left == NULL)
break;
else
{
++cnt;
prev = root;
for(int i = 0; i < cnt; ++i)
prev = prev->left;
cur = prev->left;
}
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode 二叉树
相关文章推荐