蠡口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)

猜你喜欢

转载自www.cnblogs.com/Leisgo/p/11706448.html
今日推荐