首先复习下先序遍历。
先序遍历指的是在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是属兔数组的长度