python-Reconstruct BST-使用先序遍历的结果重构BST

首先复习下先序遍历。

先序遍历指的是在BST中:

1:先访问根节点

2:再访问左节点

3:最后访问右侧节点

样例输入

[10, 4, 2, 1, 5, 17, 19, 18]

样例输出

				10

				/	\

			4			17

		/		\				\

	2				5		 		19

	/								/

	1							18

输入一个树的先序遍历的结果,写一个函数根据这个结果重建BST并返回这个BST的根节点。

Solution

# This is an input class. Do not edit.
class BST:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


def reconstructBst(preOrderTraversalValues):
    # exit condition 
    if len(preOrderTraversalValues) == 0:
        return None

    current_value = preOrderTraversalValues[0]
    #由于最后访问右侧节点,最后一个值就是右侧根节点的值
    right_sub_tree_root_index = len(preOrderTraversalValues)
    #对于除了第0个以外的所有值
    for idx in range(1,len(preOrderTraversalValues)):
        value = preOrderTraversalValues[idx]
        #如果值大于根节点(也就是第一个数)
        if value >= current_value:
            # 此时的节点的对应的index就是右侧根节点的index
            right_sub_tree_root_index = idx
            break
    #分别对左右子树进行递归
    left_subtree = reconstructBst(preOrderTraversalValues[1:right_sub_tree_root_index])
    right_subtree = reconstructBst(preOrderTraversalValues[right_sub_tree_root_index :])
    return BST(value = current_value,left = left_subtree,right = right_subtree)

### Time: O(n^2) 
### Space: O(n) n是属兔数组的长度

Time: O(n^2)

Space: O(n) n是输入的数组的长度

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值