标签:== 推导 sum obj width tin ati 必须 函数
遇到树形结构,首先想到的就是递归。本题使用递归。要对所有节点添加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
标签:== 推导 sum obj width tin ati 必须 函数
原文地址:https://www.cnblogs.com/Leisgo/p/11706448.html