📅  最后修改于: 2023-12-03 14:49:27.776000             🧑  作者: Mango
给定一个长度为n的数组pre[],其中pre[i]代表某棵特殊二叉树中第i个节点的值,该特殊二叉树具有以下性质:
该二叉树为满二叉树;
树中所有节点的值互不相同;
设在二叉树中,节点i的深度为depth[i],节点i的左儿子为left[i],右儿子为right[i],则对于任意非叶子节点i,有depth[left[i]] = depth[right[i]]。
请编写一个算法,根据给定前序遍历重建该特殊二叉树,并返回重建后二叉树的根节点。
因为该特殊二叉树为满二叉树,所以可以轻松计算出二叉树中任一个节点的深度,因而可以通过递归的方式构建该特殊二叉树。
具体来说,对于当前子树,其根节点的值为pre[index],则该节点的左、右子树各自满足如下条件:
左子树的深度为当前节点深度+1,即depth[index]+1,且左子树的节点数为2^(k-1)-1,其中k为左子树节点的深度;
右子树的深度等于当前节点深度+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)。