将使用键1,2,3,4,5,6,7获得的二叉搜索树按给定的顺序插入到最初为空的树中。
这个二进制搜索树看起来像1是根节点,2看起来是正确的子树,2有3个右子树,等等,最多7个
你得到的树有什么问题?
任何节点都没有左子树。这不满足BST的属性(左子树中的所有对象都具有比节点本身更小的键,并且与右子树相同的键具有比节点本身更大的键)。
我只是想验证这就是造成这个问题的原因。
如何修改插入算法来解决此问题?
您可以使用AVL树通过交换必要的节点来平衡它。
我的问题是:这是正确的吗?
答案 0 :(得分:0)
问题是您基本上有一个LinkedList。它仍然是二进制搜索树,但不是非常有用的树。但是,它确实满足二进制搜索树的属性。
您如何修改插入算法以解决此问题?
与其按给定的顺序插入,不如让您更聪明,然后尝试使用最小高度的二进制搜索树。这是Java的示例实现:
class App {
public static void main(String[] args) {
List<Integer> sorted = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
int mid = sorted.size() / 2;
Node rootNode = new Node();
rootNode.val = sorted.get(mid);
addChildren(sorted.subList(0, mid), rootNode, true);
addChildren(sorted.subList(mid + 1, sorted.size()), rootNode, false);
System.out.println(rootNode);
}
static void addChildren(List<Integer> sorted, Node parent, boolean left) {
if (sorted.isEmpty()) {
return;
}
int mid = sorted.size() / 2;
Node child = new Node();
child.val = sorted.get(mid);
if (left) {
parent.left = child;
} else {
parent.right = child;
}
if (sorted.size() == 1) {
return;
}
addChildren(sorted.subList(0, mid), child, true);
addChildren(sorted.subList(mid + 1, sorted.size()), child, false);
}
}
class Node {
Integer val;
Node left;
Node right;
}
此算法生成的二叉树的高度为3而不是7
4
/ \
2 6
/ \ / \
1 3 5 7
这将使您能够利用二进制搜索树的优势。