![]() |
1
3
在10出现之前,示例是有意义的。基本假设:这是一个打字错误。但它不能(也不想)成为5岁的孩子。它是9岁的左孩子。 但这也是第一个需要重组这棵树(以适应9到12之间的情况)。在我看来,最后一幅图是这样一次重组的一半。我们看到故事的结局了吗? 编辑好吧,我没有完全读完规则2。看起来10岁的孩子应该是12岁的左撇子。没有充分的理由让insert在根处采用左分支。 如果10是5或9的子级,它就不再是BST或其他任何东西,而是无序的二叉树。 |
![]() |
2
1
编辑
再想一想,我更倾向于相信你的例子中有一个错别字,而不是这不是一个BST。
如果
我认为插入算法的大纲将类似于下面的伪Python。它的要点是尽可能将节点添加为叶子,或者将其插入到任意一个子树中。不管是左边还是右边,都没关系。 基本上,我们只是在整棵树上寻找任何可以作为叶节点添加新值的地方。正如您所说,排序标准只适用于直系子女。您必须对添加新的叶节点很挑剔。但是你会不加选择地尝试左、右两个子树。
我猜这变得棘手的地方是,如果你必须尝试平衡子树,而不是随意地在树的任意点插入新节点。如果这是一个问题,那么您可以修改上述算法,将其插入尽可能最浅的点。
假装有一个
在真正的代码中,我会写一个“如果你要插入一个节点,你会在哪里插入它?”辅助方法。在两个子树上运行该方法,比较插入点,然后选择一个(即最浅的)。代码可能有点笨拙,但它可以避免您两次遍历每个子树。 |
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |