Populating Next Right Pointers in Each Node I

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

乍一看很难,理清思路后很简单的。

/**
* 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||root->left==NULL)
return;
root->left->next=root->right;
if(root->next!=NULL)
root->right->next=root->next->left;
connect(root->left);
connect(root->right);
return ;
}
};

 

II

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
/**
* 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(NULL == root) return;
TreeLinkNode* start;
TreeLinkNode* curNode;
TreeLinkNode* nextNode;
while(root != NULL){
start = findStartNodeNextLev(root);
curNode = start;
nextNode = findNextNodeNextLev(root, start);
while(nextNode != NULL){
curNode -> next = nextNode;
curNode = nextNode;
nextNode = findNextNodeNextLev(root, curNode);
}
root = start;
}
}
private:
TreeLinkNode* findNextNodeNextLev(TreeLinkNode* &cur, TreeLinkNode* curNextLev){
if(cur -> left == curNextLev && cur -> right != NULL){
return cur -> right;
}else{
while(cur -> next != NULL){
cur = cur -> next;
if(cur -> left != NULL && cur -> left != curNextLev) return cur -> left;
if(cur -> right != NULL && cur -> right != curNextLev) return cur -> right;
}
}
return NULL;
} TreeLinkNode* findStartNodeNextLev(TreeLinkNode* node){
if(NULL == node) return NULL;
if(node -> left != NULL) return node -> left;
return findNextNodeNextLev(node, node -> left);
}
};

  

最新文章

  1. 第一个PyQt程序
  2. block,inline和inline-block对比
  3. centos7.0 安装vsftp实录
  4. 使用自己的CSS框架(转)
  5. spring-boot 加载本地静态资源文件路径配置
  6. mac下 ssh免密码登陆设置
  7. sort 树 hash 排序
  8. Android实例-解决虚拟键盘遮挡问题(XE8+小米2)
  9. warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
  10. 初涉JavaScript模式 (4) : 构造函数
  11. HTML中的figure与figcaption标签
  12. oracle 修改dbid和dbname
  13. java 集合中将元素倒序排列
  14. 一张表搞懂各种 Docker 监控方案 - 每天5分钟玩转 Docker 容器技术(86)
  15. 机器学习-kNN
  16. 写的还不错的专题,android性能优化
  17. SVN汉化教程2017.10.6
  18. 使用docker安装sentry
  19. 配置中心Server端
  20. IIS7.0上传在大小限制

热门文章

  1. Vue.js中的常用的指令缩写
  2. 什么是static?什么是final?
  3. 《时间序列分析及应用:R语言》读书笔记--第二章 基本概念
  4. node记录
  5. springcloud文章推荐
  6. 跨域共享cookie和跨域共享session
  7. AngularJs 中的CheckBox前后台交互
  8. js数组的误解
  9. 【BZOJ4540】【HNOI2016】序列 [莫队][RMQ]
  10. Bzoj4870 [SXOI2017]组合数问题