我正在尝试制作一个算法,该算法创建一个完整的二叉搜索树,给出一个值列表。完整的是,除了最后一层以外,所有层次都是完整的,它需要尽可能将所有元素向左移动。从列表中创建一个完整的二叉搜索树
我已经实现的东西(在Python),将创建一个平衡BST,像这样:
# TreeNode constructor takes (data, left, right, parent)
def make_tree(arr, parent):
if not arr:
return None
length = len(arr)
if length == 1:
return TreeNode(arr[0], None, None, parent)
else:
mid = int(len(arr)/2)
mid_node = TreeNode(arr[mid], None, None, parent)
mid_node.left = make_tree(arr[0:mid], mid_node)
mid_node.right = make_tree(arr[mid+1:length], mid_node)
return mid_node
它的工作原理由中点递归分割的列表,并且使中点父节点。
但是,这不会创建完整 BST。鉴于名单[2,4,7,8,10],它会创建这样的:
7
/ \
4 10
/ /
2 8
但一个完整的BST是这样的:
8
/ \
4 10
/\
2 7
你有如何的任何建议修改我的方法来完成这个?
你必须添加你的平衡旋转:P –
使用'int(len(arr)/ 2)'找到中间节点是不正确的。例如,在一个有11个节点的树中,左子树有7个节点,右子树有3个节点。您目前的方法会在左侧放五个,右侧放五个。 – Kevin
你应该阅读关于AVL树 – Rerito