题目:

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的更多相关文章

  1. 【遍历二叉树】12往二叉树中添加层次链表的信息【Populating Next Right Pointers in Each Node II】

    本质上是二叉树的层次遍历,遍历层次的过程当中把next指针加上去. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  2. 【LeetCode】117. Populating Next Right Pointers in Each Node II 解题报告(Python)

    [LeetCode]117. Populating Next Right Pointers in Each Node II 解题报告(Python) 标签: LeetCode 题目地址:https:/ ...

  3. 【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 ...

  4. 【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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 这个题实际上就是把每一行最右侧的树打印出来,所以实际上还是一个层次遍历. 依旧利用之前层次遍历的代码,每次大的循环存 ...

  9. Leetcode 树 Populating Next Right Pointers in Each Node II

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Populating Next Right Pointers in Each Node II ...

随机推荐

  1. 比特币钱包应用breadwallet源码

    breadwallet是一款安全.可靠和便捷的比特币钱包,可使用户免于恶意软件和其他应用中常见的安全问题的骚扰,充分利用了iOS提供的安全功能,包括AES硬件加密.app沙盒和数据保护.代码签名以及k ...

  2. silverlight 不能输入中文问题

    <param name="Windowless" value="true" />将调用silverlight页面的这句删除掉应该就能解决问题了 1. ...

  3. 安卓手机的touchend事件不触发问题

    问题描述 $(document).on("touchstart touchmove",".btn-highlight",function(event){ $(t ...

  4. 设计师眼中功能强大的Xcode

    作为设计师,不仅要能创造出移动为先的新产品,更要了解能创造出优秀移动作品的工具.这个实现过程可以让我们的设计更加优秀. 过去两个月,我每天在 Xcode 上花费的时间大约有 10 个小时,我学到了很多 ...

  5. Learning Scrapy笔记(零) - 前言

    我已经使用了scrapy有半年之多,但是却一直都感觉没有入门,网上关于scrapy的文章简直少得可怜,而官网上的文档(http://doc.scrapy.org/en/1.0/index.html)对 ...

  6. linux下的mount命令的用法详解

    挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...

  7. m3u8

    audo apt-get install pkg-configsudo apt-get install automake autoconf m4 libtool sudo apt-get instal ...

  8. ubuntu crontab 定时备份postgres数据库并上传ftp服务器

    最近公司要求备份数据库,所以就查了比较作的资料.废话不多说,入正题. 目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器. 经过查找资料,解决方法: ①编写备份数据库.打 ...

  9. 019C#中使用移位运算符获取汉字编码值

    在进行移位运算时,当数值的二进制数每次向左移1位就相当于乘以2,当数值每次向右移一位就相当于除以2 private void button1_Click(object sender, EventArg ...

  10. centos下各种c++库文件的安装

    Centos编译boost   1.下载最新的boost http://www.boost.org/   2.解压文件 tar -xzvf boost_1_45_0.tar.gz    3.编译bja ...