【Populating Next Right Pointers in Each Node II】cpp
题目:
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 (!root) return;
deque<TreeLinkNode *> curr, next;
curr.push_back(root);
while ( !curr.empty() )
{
TreeLinkNode dummy(-);
TreeLinkNode *pre = &dummy;
while ( !curr.empty() )
{
TreeLinkNode *tmp = curr.front(); curr.pop_front();
pre->next = tmp;
if (tmp->left) next.push_back(tmp->left);
if (tmp->right) next.push_back(tmp->right);
pre = tmp;
}
pre->next = NULL;
std::swap(curr, next);
}
}
};
tips:
广搜思路(有些违规,因为不是const extra space)
每一层设立一个虚拟头结点,出队的同时pre->next = tmp
=====================================
学习了另外一种思路,可以不用队列的数据结构,这样就符合const extra space的条件了。代码如下:
/**
* 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) {
TreeLinkNode *pre;
TreeLinkNode *curr;
TreeLinkNode *next_first; // store next level's first not null node
curr = root;
while ( curr ){
// move to next tree level
TreeLinkNode dummy(-);
pre = &dummy;
next_first = NULL;
// connect the curr level
// record the first not null left or right child of the curr level as for the first node of next level
while ( curr ){
if ( !next_first ){
next_first = curr->left ? curr->left : curr->right;
}
if ( curr->left ){
pre->next = curr->left;
pre = pre->next;
}
if ( curr->right ){
pre->next = curr->right;
pre = pre->next;
}
curr = curr->next;
}
curr = next_first;
}
}
};
tips:
这套代码的大体思路是数学归纳法
1. root节点的root->next按照题意是NULL
2. 处理root的left节点和right节点之间的next关系
...如果知道了第n-1层的node之间的next关系,则可以得到第n层node节点之间的next关系...
按照这套思路,就可以写出上述的代码。
这里有两个细节需要注意:
a. next_first不一定是left还是right,这个要注意,只要next_first一直为NULL就要一直找下去。
b. 设立一个dummy虚node节点,令pre指向dummy,可以不用判断pre为NULL的情况,简化判断条件。
另,回想为什么level order traversal的时候必须用到队列,可能就是因为没有每一层之间的next关系。
==========================================
第二次过这道题,直接看常数空间复杂度的思路,重新写了一遍AC。
/**
* 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) {
TreeLinkNode* curr = root;
while ( curr )
{
TreeLinkNode* pre = new TreeLinkNode();
TreeLinkNode* next_level_head = NULL;
while ( curr )
{
if ( !next_level_head )
{
next_level_head = curr->left ? curr->left : curr->right;
}
if ( curr->left )
{
pre->next = curr->left;
pre = pre->next;
}
if ( curr->right )
{
pre->next = curr->right;
pre = pre->next;
}
curr = curr->next;
}
curr = next_level_head;
}
}
};
【Populating Next Right Pointers in Each Node II】cpp的更多相关文章
- 【遍历二叉树】12往二叉树中添加层次链表的信息【Populating Next Right Pointers in Each Node II】
本质上是二叉树的层次遍历,遍历层次的过程当中把next指针加上去. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 【LeetCode】117. Populating Next Right Pointers in Each Node II 解题报告(Python)
[LeetCode]117. Populating Next Right Pointers in Each Node II 解题报告(Python) 标签: LeetCode 题目地址:https:/ ...
- 【leetcode】Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...
- 【LeetCode】117. Populating Next Right Pointers in Each Node II (2 solutions)
Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...
- 29. Populating Next Right Pointers in Each Node && Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node OJ: https://oj.leetcode.com/problems/populating-next-rig ...
- Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node Total Accepted: 72323 Total Submissions: 199207 Difficul ...
- leetcode 199. Binary Tree Right Side View 、leetcode 116. Populating Next Right Pointers in Each Node 、117. Populating Next Right Pointers in Each Node II
leetcode 199. Binary Tree Right Side View 这个题实际上就是把每一行最右侧的树打印出来,所以实际上还是一个层次遍历. 依旧利用之前层次遍历的代码,每次大的循环存 ...
- Leetcode 树 Populating Next Right Pointers in Each Node II
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Populating Next Right Pointers in Each Node II ...
随机推荐
- iOS 层层推进实现代理模式
1.代理模式核心思想:A类委托B类做某件事,然后A类获取B类的执行的返回结果! 举例:女孩想去买电影票,但是自己不亲自去而是委托男孩了解电影电影票信息,同时女孩获得男孩买票的结果,代码模拟实现: /* ...
- dedecms后台上传图片附件返回302的问题
在网上查了资料,验证可行后,在这儿做个备份! 自己解决了,貌似是swfupload在linux环境下session丢失的引起的 解决办法是:在include/userlogin.class.php文件 ...
- 软件工程 speedsnail 第二次冲刺3
20150520 完成任务:划线第三天,能画出一条直黄线且与蜗牛共存: 遇到问题: 问题1 碰撞检测有缺陷 解决1 没有解决 明日任务: 实现蜗牛与线的碰撞
- 软件工程 speedsnail 第二次冲刺1次
20150518 完成任务:划线第一天,能画出一天连续的红线: 遇到问题: 问题1 线是弯曲的 解决1 没有解决 明日任务: 将线画直
- SQL中补0
SQL中补0 编写人:CC阿爸 2014-3-14 第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数 ...
- Knockout.Js官网学习(数组observable)
前言 如果你要探测和响应一个对象的变化,你应该用observables. 如果你需要探测和响应一个集合对象的变化,你应该用observableArray . 在很多场景下,它都非常有用,比如你要在UI ...
- 史上最全Vim快捷键键位图(入门到进阶)
经典版 下面这个键位图应该是大家最常看见的经典版了. 对应的简体中文版 其实经典版是一系列的入门教程键位图的组合结果,下面是不同编辑模式下的键位图. 入门版 基本操作的入门版. 进阶版 增强版 下图是 ...
- encodeURIComponent编码后java后台的解码
解决方法一: JavaScript: window.self.location="searchbytext.action?searchtext="+encodeURICompone ...
- ASP.NET MVC5学习笔记之Filter提供体系
前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的. 一.Filter集合 在ControlerActionI ...
- ajax使用。
<script> function createAjax(){ var request=false; //window对象中有XMLHttpRequest存在就是非IE,包括(IE7,IE ...