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

116. Populating Next Right Pointers in Each Node

2016-03-17 11:33 357 查看
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


解法一:
该解法没满足 使用常量空间的要求,使用层次遍历算法,借助队列queue,在每层的最后一个原素时,在队列尾部追加NULL,用NULL表示本层次遍历完毕。
初始时 队列为:root NULL
如果队列当前输出为NULL,且队列仍有原素,则表示,不是最后一层,且当前层扫描完毕,则在队列尾部追加NULL,标记下一层结尾处。这样,保证每层最后一个节点的后边是NULL,层与层之间有NULL作为间隔符。
如果队列当前输出为NULL,且队列为空,则表示已经最后一层,遍历结束。
在遍历时把next链接起来,
当遍历的当前cur 时,cur->next=que.front(),每层结尾
判断是否有左右孩子,并入队。
void connect(TreeLinkNode *root) {
if(!root)
return;
queue<TreeLinkNode*> que;
que.push(root);
que.push(NULL);
while(!que.empty()){
TreeLinkNode *cur=que.front();
que.pop();

if(cur==NULL){
if(que.empty())
return;
else{
que.push(NULL);
continue;
}
}
cur->next=que.front();

if(cur->left)
que.push(cur->left);
if(cur->right)
que.push(cur->right);
}
}
解法二
该解法思想是 利用上一层可以利用next指针遍历上一层元素,而上一层每个元素可以利用left和right访问当前层元素,
则可用两个指针标记上一层的头指针和下一层的头指针:
因为是完全二叉树,则每个节点要么左右节点都有,要么全没有,且叶子节点再最后一层。

算法,通过遍历上一层节点,连接下层节点的next域。
初始化:root->next=NULL;
lastHead=root;
void connect(TreeLinkNode *root) {
if(!root)
return;
root->next=NULL;//初始化
TreeLinkNode *curnode=root->left;//当前层节点
TreeLinkNode *lastHead=root;//上一层首节点
TreeLinkNode *nextHead=NULL;//下一层首节点
TreeLinkNode *p=NULL;//上一层 遍历节点指针
while(curnode){//当前结点不为空,也即当前结点不是最后一层,(完全二叉树,)
nextHead=curnode->left;//下层节点为当前层首节点的left表示
p=lastHead;//上一层遍历节点指针,用上层指针首节点初始。
lastHead=curnode;//保存当前首节点为下层遍历的上层节点。
while(p&&p->next){
curnode->next=p->right;
curnode->next->next=p->next->left;
p=p->next;
curnode=p->left;
}
curnode->next=p->right;
curnode->next->next=NULL;
curnode=nextHead;//迭代 下一层
}
}

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