116. Populating Next Right Pointers in Each Node
2016-03-17 11:33
357 查看
Given a binary tree
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,
解法一:
该解法没满足 使用常量空间的要求,使用层次遍历算法,借助队列queue,在每层的最后一个原素时,在队列尾部追加NULL,用NULL表示本层次遍历完毕。
初始时 队列为:root NULL
如果队列当前输出为NULL,且队列仍有原素,则表示,不是最后一层,且当前层扫描完毕,则在队列尾部追加NULL,标记下一层结尾处。这样,保证每层最后一个节点的后边是NULL,层与层之间有NULL作为间隔符。
如果队列当前输出为NULL,且队列为空,则表示已经最后一层,遍历结束。
在遍历时把next链接起来,
当遍历的当前cur 时,cur->next=que.front(),每层结尾
判断是否有左右孩子,并入队。
该解法思想是 利用上一层可以利用next指针遍历上一层元素,而上一层每个元素可以利用left和right访问当前层元素,
则可用两个指针标记上一层的头指针和下一层的头指针:
因为是完全二叉树,则每个节点要么左右节点都有,要么全没有,且叶子节点再最后一层。
算法,通过遍历上一层节点,连接下层节点的next域。
初始化:root->next=NULL;
lastHead=root;
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 7After 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; } }
相关文章推荐
- 《超实用的Node.js代码段》连载二:正确拼接Buffer
- leetcode 237. Delete Node in a Linked List
- 《超实用的Node.js代码段》连载二:正确拼接Buffer
- convertToNodeSpace 与 convertToWorldSpace 的使用
- node.js使用cluster实现多进程
- XML SelectSingleNode的使用 根据节点属性获取该节点
- NodeJS的代码调试和性能调优
- node.js使用cluster实现多进程
- Node.js实用代码段之获取Buffer对象字节长度
- Node.js实用代码段之正确拼接Buffer
- nodejs导出模块功能原理的个人理解
- nodeJS newman mail 安装
- node.js递归打印文件目录、文件名
- 认识DOM的三大节点:元素节点,文本节点,属性节点以及nodeName,nodeType,nodeValue的区别
- 关于使用node进行网站前后端分离设想和问题解决
- NodeJS实战
- PAT--1115. Counting Nodes in a BST
- ZeroC Ice IceGrid Node和IceGrid
- IceGrid Node和IceGrid
- Leetcode 19 Remove Nth Node From End of List 链表