蠡口116. Populating Next Right Pointers in Each Node
Posted leisgo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蠡口116. Populating Next Right Pointers in Each Node相关的知识,希望对你有一定的参考价值。
遇到树形结构,首先想到的就是递归。本题使用递归。要对所有节点添加next指针,我们可以分两步完成:1、左子树每层最右 -> 右子树每层最左;2、左右子树递归地调研函数来添加(如下图所示)。两者顺序可以颠倒,但是两个都是必要的,如果函数里只写left.next=right就进行递归,那么遍历的时候左右孩子树相互独立,左右孩子树的下一层(孙子树)不能建立起连接。必须要每一层都建立起连接。
看代码前先来分析一下时间复杂度: 假设树高h,由于是所给的二叉树是完美二叉树(所有节点都有2个孩子,且同一层的节点的树高一样),所以h=log2n,n为节点数。
T(h)=O(h-1)+2*T(h-1)
=O(h-1)+2*O(h-2)+4*T(h-2)
=...=∑O(k·2h-k-1) (k=1 ~ h-1)
=O(2h-1·∑k·2-k)
=O(2h-1·(2-22-h-(h-1)21-h)) #推导见下图,用到了错位相减,等比数列前n项和公式。这两个在分析树形结构算法的复杂度时经常用到。
=O(2h-h-1)
=O(2h)=O(n)
代码如下:
class Solution(object):
def connect(self, root):
"""
:type root: Node
:rtype: Node
"""
if root==None: return(None)
left,right=root.left,root.right
while left:
left.next=right
left=left.right
right=right.left
self.connect(root.left)
self.connect(root.right)
return(root)
以上是关于蠡口116. Populating Next Right Pointers in Each Node的主要内容,如果未能解决你的问题,请参考以下文章
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node