Q2. (二叉排序树)有这样一串数字,5,2,8,0,10,7,18,20,30,12,15,1,将它们建成一颗二叉排序树。二叉排序树满足下面的条件:
(1)如果左子树不为空,则左子树上所有的节点的值均小于树的根节点的值。同样,如果右子树不为空,则右子树上所有节点的值均大于树的根节点的值。
(2)左右子树本身也是二叉排序树。
对于上述数字,我们在建立二叉排序树时,先把第一个数字5放在根节点,然后扫描第二个数字2,由于它比根节点的数字5小,因此我们将它放在左子树中。接下来我们扫描第三个数字8,由于它比根节点的数字5大,因此我们将它放在右子树中。重复上述过程,我们可以建成完整的二叉排序树。请完成下面三个小问题:
i:写一个算法完成上述操作。
ii:这个算法的复杂度是多少?
iii:用何种遍历方法得到的结果恰好把上面的一串数字排好序?
(1)
class TreeNode:
def __init__(self, value, left_node, right_node):
self.value = value
self.left_node = left_node
self.right_node = right_node
class Tree:
def __init__(self, tree_node):
self.root = tree_node
def insert(self, value):
new_node = TreeNode(value, None, None)
current_node = self.root
while current_node:
if current_node.value < new_node.value:
if current_node.right_node is None:
current_node.right_node = new_node
return
current_node = current_node.right_node
else:
if current_node.left_node is None:
current_node.left_node = new_node
return
current_node = current_node.left_node
def build(self, tree_node_list):
for item in tree_node_list:
self.insert(item)
def ergodic_tree(node):
if node is None:
return
ergodic_tree(node.left_node)
print(f'current node is {node.value}')
ergodic_tree(node.right_node)
if __name__ == '__main__':
root_node = TreeNode(5, None, None)
new_tree = Tree(root_node)
test_arr = [2, 8, 0, 10, 7, 18, 20, 30, 12, 15, 1]
new_tree.build(test_arr)
ergodic_tree(root_node)
(2)平均时间复杂度 O(nlogn),最坏情况下O(n*n)
(3)中序遍历