Tob*_*bi3 5 algorithm binary-tree binary-search
如果我构造一个二进制搜索树,按顺序添加以下值:
10, 7, 16, 12, 5, 11, 2, 20, 1, 14
Run Code Online (Sandbox Code Playgroud)
我得到一个高度为5的树.是否有一个方法(除了试验和错误)我可以用来确定一个整数的排序,它将创建一个高度为4的树?
是的,您可以首先构建一个完美平衡的树,然后您可以以在子节点之前打印父节点的方式输出节点.
要创建一个完美平衡的树,只需对数字进行排序,然后使用递归二进制除法来构建树.
例如,在您的情况下,我们会对数字进行排序
1 2 5 7 10 11 12 14 16 20
Run Code Online (Sandbox Code Playgroud)
然后从它们构建一个平衡的树(以中间数字作为根并递归重复此过程)
11
5 14
1 7 12 16
2 10 20
Run Code Online (Sandbox Code Playgroud)
我们现在可以使用preorder遍历或广度优先遍历来按照您想要的顺序打印节点(只要我们在子节点之前输出父节点就可以了).
11 5 14 1 7 12 16 2 10 20
Run Code Online (Sandbox Code Playgroud)
我没有完全想到这一点,但是获取特定深度的树的一种方法是在插入元素之前对它们进行排序:即排序然后将N
元素插入到二叉搜索树中将产生深度树N
.
你或许可以:
K=4
内容以生成深度树K
(当然,选择K
开始的元素和插入剩余元素的策略是棘手的部分 - 但也许这将是一个开始?)
编辑:我认为一般解决方案是可能的,假设K
足够大.这个怎么样:
10, 7, 16, 12, 5, 11, 2, 20, 1, 14
1, 2, 5, 7, 10, 11, 12, 14, 16, 20
例如,在排序并插入最后4个之后:
12
\
14
\
16
\
20
Run Code Online (Sandbox Code Playgroud)
...然后插入最后3:
12
/ \
7 14
\ \
10 16
\ \
11 20
Run Code Online (Sandbox Code Playgroud)
...然后在最后2:
12
/ \
7 14
/ \ \
2 10 16
\ \ \
5 11 20
Run Code Online (Sandbox Code Playgroud)
...最后,插入最后一个元素后:
12
/ \
7 14
/ \ \
2 10 16
/ \ \ \
1 5 11 20
Run Code Online (Sandbox Code Playgroud)
...你的BST高度为K = 4.
请注意,这种方法只有在K
足够大时才会起作用- 特别是在何时K(K+1)/2 >= N
.