|
1
3
在10出现之前,示例是有意义的。基本假设:这是一个打字错误。但它不能(也不想)成为5岁的孩子。它是9岁的左孩子。 但这也是第一个需要重组这棵树(以适应9到12之间的情况)。在我看来,最后一幅图是这样一次重组的一半。我们看到故事的结局了吗? 编辑好吧,我没有完全读完规则2。看起来10岁的孩子应该是12岁的左撇子。没有充分的理由让insert在根处采用左分支。 如果10是5或9的子级,它就不再是BST或其他任何东西,而是无序的二叉树。 |
|
|
2
1
编辑
再想一想,我更倾向于相信你的例子中有一个错别字,而不是这不是一个BST。
如果
我认为插入算法的大纲将类似于下面的伪Python。它的要点是尽可能将节点添加为叶子,或者将其插入到任意一个子树中。不管是左边还是右边,都没关系。 基本上,我们只是在整棵树上寻找任何可以作为叶节点添加新值的地方。正如您所说,排序标准只适用于直系子女。您必须对添加新的叶节点很挑剔。但是你会不加选择地尝试左、右两个子树。
我猜这变得棘手的地方是,如果你必须尝试平衡子树,而不是随意地在树的任意点插入新节点。如果这是一个问题,那么您可以修改上述算法,将其插入尽可能最浅的点。
假装有一个
在真正的代码中,我会写一个“如果你要插入一个节点,你会在哪里插入它?”辅助方法。在两个子树上运行该方法,比较插入点,然后选择一个(即最浅的)。代码可能有点笨拙,但它可以避免您两次遍历每个子树。 |
|
|
Peter · DFS遍历中的(java)奇怪列表值 8 年前 |
|
|
Fawad Bin Tariq · 二叉搜索树递归混淆 9 年前 |
|
|
Elessar.perm · Neo4j循环性能 9 年前 |
|
|
KlydeMonroe · Umbraco-仅获取文档类型的子元素 10 年前 |
|
|
Brett · Python Trie:如何遍历它来构建所有单词的列表? 10 年前 |
|
|
Stream Major · Neo4j:K-Hop与Cypher距离3 10 年前 |
|
|
whisperstream · 如何找到嵌入集包含值“x”的边? 10 年前 |
|
|
morne · 是否可以通过遍历检测更改? 11 年前 |
|
|
triplethreat77 · 使用选定的表输入更新特定的div输入 11 年前 |