Populating Next Right Pointers in Each Node

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
'''
Created on Nov 19, 2014 @author: ScottGu<gu.kai.66@gmail.com, 150316990@qq.com>
'''
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None class Solution:
# @param root, a tree node
# @return nothing
def connect(self, root):
stack=[]
if(root==None): return
stack.append(root)
while(len(stack)!=0):
for ix in range(len(stack)-1):
stack[ix].next=stack[ix+1]
stack[-1].next=None
cntOfLastLevel=len(stack)
for ix in range(cntOfLastLevel):
if (stack[0].left!=None):stack.append(stack[0].left)
if (stack[0].right!=None):stack.append(stack[0].right)
stack.remove(stack[0]) class Solution2:
# @param root, a tree node
# @return nothing
def connect(self, root):
if(root==None): return
head_high=cursor_high=root
head_low = cursor_low=None while(cursor_high.left!=None):
head_low = cursor_low=cursor_high.left cursor_low.next=cursor_high.right
cursor_low=cursor_low.next
while(cursor_high.next!=None):
cursor_high=cursor_high.next
cursor_low.next=cursor_high.left
cursor_low=cursor_low.next
cursor_low.next=cursor_high.right
cursor_low=cursor_low.next
cursor_low.next=None head_high=cursor_high=head_low

题目和代码如上所述,这个题比较有意思的地方是,这个数据结构有点像数据库索引的结构,上述代码实现了两种方法,两种方法都是层级遍历,时间复杂度都是O(N),但空间复杂度不一样,实现难度也不一样。

1. 第一种更为简单,但使用了额外的空间用于存储上一层节点,最大空间复杂度为所有叶子节点的大小之和。所以类似这种算法如果用于建立DB索引的话,恐怕内存就要爆掉了,第二种方法则没有问题。

2. 第二种稍复杂,但是空间复杂度只有O(1),也就是无需任何额外内存。实现方法是使用两个游标和1个标志位,两个游标用于并行遍历两行nodes,1个标志位用于标记下面那行的head。

 两游标并行往前走,会同时走到各自行的结尾,这时两游标各自下移到下一行开始(这就是为啥要标记那行的head)然后重复上面的过程继续往前走,当没有下一行时停止(第二个游标没得指了),请自行脑补2个游标遍历所有nodes并且加链接的过程。

LEETCODE —— Populating Next Right Pointers in Each Node的更多相关文章

  1. LeetCode:Populating Next Right Pointers in Each Node I II

    LeetCode:Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeL ...

  2. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  3. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  4. LeetCode——Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  5. [leetcode]Populating Next Right Pointers in Each Node II @ Python

    原题地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 题意: Follow up ...

  6. LeetCode: Populating Next Right Pointers in Each Node II 解题报告

    Populating Next Right Pointers in Each Node IIFollow up for problem "Populating Next Right Poin ...

  7. LeetCode - Populating Next Right Pointers in Each Node II

    题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...

  8. LeetCode: Populating Next Right Pointers in Each Node 解题报告

    Populating Next Right Pointers in Each Node TotalGiven a binary tree struct TreeLinkNode {      Tree ...

  9. [LeetCode] [LeetCode] Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

随机推荐

  1. javafx之登陆界面的跳转

    界面布局用到的是fxml而非纯java代码,工具是javafx sence builder 账号:account 密码:password 登陆成功: 可以点击退出登陆返回到登陆页面 工程目录: pac ...

  2. druid.properties的配置

    driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://NoOne:3306/eyes<!--需修改--> username=root ...

  3. iOS 判断View 是否是第一次显示

    在实现某些需求的时候会有这样的情况,页面第一次加载显示的时候需要某些操作,而以后就不需要重复执行了, 一般这种处理都放在- (void)viewDidLoad或- (id)init因为一般这两个函数除 ...

  4. 百度star编程赛-练习1

    ztr loves math http://acm.hdu.edu.cn/showproblem.php?pid=5675 显然:4 ^ n * (a + b) * (a -b) #include & ...

  5. 使用恶意USB设备解锁 Windows & Mac 锁屏状态

    NSA专业物理入侵设备——USB Armory,可解锁任意锁屏状态的下的Windows和Mac操作系统,含最新发布的Windows10.及较早的Mac OSX El Capitan / Maveric ...

  6. Ubuntu 手工挂载硬盘

    首先我们得到到/dev/sda3这个分区的UUID,使用以下命令: sudo blkid /dev/sda3 结果如下: 然后,我们按照/etc/fstab文件中的格式添加一行如下内容: UUID=9 ...

  7. 使用spring @Scheduled注解执行定时任务、

    http://blog.csdn.net/sd4000784/article/details/7745947,留下来备用.

  8. JAVA学习遇到的问题:接口实现

    引用知乎看到对接口的总结: 接口就是个招牌比如说你饿了,看到前面有个挂着KFC的店,然后你想到可以进去买汉堡了.KFC就是接口,我们看到了这个接口,就知道这个店会卖汉堡(实现接口).那么为什么我们要去 ...

  9. Java随笔四---Java异常

    1.throw语句:Java编译器在执行throw语句时,会立即停止常规的程序执行,开始寻找能够捕获或处理异常的异常处理程序: 2.异常处理程序使用try/catch/finally编写. 3.如果当 ...

  10. Centeros7 环境相关问题

    服务处理命令 systemctl start mariadb #启动MariaDB systemctl stop mariadb #停止MariaDB systemctl restart mariad ...