如果我按顺序添加以下值来构建二叉搜索树:
10, 7, 16, 12, 5, 11, 2, 20, 1, 14
我得到了一棵高度为5的树。除了试错之外,是否有其他方法可以确定一个整数排序方式,以创建一个高度为4的树?
10, 7, 16, 12, 5, 11, 2, 20, 1, 14
我得到了一棵高度为5的树。除了试错之外,是否有其他方法可以确定一个整数排序方式,以创建一个高度为4的树?
是的,你可以先构建一棵完全平衡的树,然后按照父节点在其子节点之前的顺序输出节点。
要创建一棵完全平衡的树,只需对数字进行排序,然后使用递归二分法构建树即可。
例如,在你的情况下,我们将对数字进行排序
1 2 5 7 10 11 12 14 16 20
然后从这些数字构建一棵平衡树(将中间的数字作为根,递归地重复此过程)
11
5 14
1 7 12 16
2 10 20
11 5 14 1 7 12 16 2 10 20
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
12
\
14
\
16
\
20
在插入最后三个元素之后:
12
/ \
7 14
\ \
10 16
\ \
11 20
...然后在最后的两个之后:
12
/ \
7 14
/ \ \
2 10 16
\ \ \
5 11 20
最后,在插入最后一个元素之后:
12
/ \
7 14
/ \ \
2 10 16
/ \ \ \
1 5 11 20
...你将得到一棵高度为K=4的二叉搜索树。
请注意,此方法仅在K
足够大时才有效--具体来说,当K(K+1)/2 >= N
时。
public void testMakeBinarySearchTree() {
List<Integer> array = new ArrayList<>();
for (int i = 0; i < 10; i++) {
array.add(i+1);
}
Collections.shuffle(array);
Node root = new Node(array.get(5));
for (int value : array) {
binarySearchTreeInsertNode(root, value);
}
}
private void binarySearchTreeInsertNode(Node node, int value) {
int data = node.getData();
if ( value > data) {
Node right = node.getRight();
if (right != null) {
binarySearchTreeInsertNode(right, value);
} else {
node.setRight(new Node(value));
}
} else if (value < data) {
Node left = node.getLeft();
if (left != null) {
binarySearchTreeInsertNode(left, value);
} else {
node.setLeft(new Node(value));
}
}
}