📌  相关文章
📜  从给定的前序遍历构造一棵特殊的树(1)

📅  最后修改于: 2023-12-03 14:49:27.776000             🧑  作者: Mango

从给定的前序遍历构造一棵特殊的树

问题描述

给定一个长度为n的数组pre[],其中pre[i]代表某棵特殊二叉树中第i个节点的值,该特殊二叉树具有以下性质:

  1. 该二叉树为满二叉树;

  2. 树中所有节点的值互不相同;

  3. 设在二叉树中,节点i的深度为depth[i],节点i的左儿子为left[i],右儿子为right[i],则对于任意非叶子节点i,有depth[left[i]] = depth[right[i]]。

请编写一个算法,根据给定前序遍历重建该特殊二叉树,并返回重建后二叉树的根节点。

解题思路

因为该特殊二叉树为满二叉树,所以可以轻松计算出二叉树中任一个节点的深度,因而可以通过递归的方式构建该特殊二叉树。

具体来说,对于当前子树,其根节点的值为pre[index],则该节点的左、右子树各自满足如下条件:

  1. 左子树的深度为当前节点深度+1,即depth[index]+1,且左子树的节点数为2^(k-1)-1,其中k为左子树节点的深度;

  2. 右子树的深度等于当前节点深度+1,即depth[index]+1,且右子树的节点数为2^(k)-1,其中k为右子树节点的深度。

由此,可以得到如下递归函数:

def build_special_tree(pre, depth, index):
    if index == len(pre):
        return None
    root = TreeNode(pre[index])
    left_size = 2**(depth[index+1]-depth[index]-1) - 1
    root.left = build_special_tree(pre, depth, index+1)
    root.right = build_special_tree(pre, depth, index+1+left_size)
    return root
参考代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
def build_special_tree(pre, depth, index):
    if index == len(pre):
        return None
    root = TreeNode(pre[index])
    left_size = 2**(depth[index+1]-depth[index]-1) - 1
    root.left = build_special_tree(pre, depth, index+1)
    root.right = build_special_tree(pre, depth, index+1+left_size)
    return root
复杂度分析

时间复杂度:O(n),其中n为二叉树的节点个数。由于每个节点最多只会被访问一次,因而时间复杂度为O(n)。

空间复杂度:O(h),其中h为二叉树的高度。由于需要递归调用函数,因而空间复杂度等于递归调用栈的深度,最坏情况下等于二叉树的高度,为O(h)。