【发布时间】:2015-01-16 19:54:56
【问题描述】:
我有一本书以一种非常糟糕的方式解释了二叉搜索树背后的理论级别。
以这个字符串树为例:
(对不起我的油漆)这个例子直接取自我的书:)
有人可以向我解释一下顺序吗?这背后的逻辑是什么?
【问题讨论】:
-
如果示例树中确实有两个
Karen节点,那么从技术上讲它不是 BST,因为不允许重复节点。
标签: binary-tree binary-search-tree
我有一本书以一种非常糟糕的方式解释了二叉搜索树背后的理论级别。
以这个字符串树为例:
(对不起我的油漆)这个例子直接取自我的书:)
有人可以向我解释一下顺序吗?这背后的逻辑是什么?
【问题讨论】:
Karen 节点,那么从技术上讲它不是 BST,因为不允许重复节点。
标签: binary-tree binary-search-tree
在 BST 中,每个节点最多有一个左孩子和一个右孩子。给定节点左侧的每个节点都小于它,而给定节点右侧的每个节点都大于它。这样做的后果之一是你不能有重复的值,所以我不确定这个例子是否正是这本书的内容。
在您的示例中,字符串按字母顺序排列。以根节点为例,Bob 在 Karen 之前,所以 Bob 在 Karen 的左边。汤姆在凯伦之后,所以汤姆在凯伦的右边。从整个树来看,您可以看到 Karen 左侧的每个节点(Bob、Alan、Ellen)按字母顺序排在 Karen 之前,而 Karen 右侧的每个节点(Tom、Wendy)按字母顺序排在 Karen 之后。无论你看哪个节点,这个模式都是一样的。
【讨论】:
对于任何节点(例如,Karen - 根),左子树(Bob、Alan、Ellen)中的每个节点在字典上都小于 Karen,而右子树中的每个节点 ( Tom, Wendy) 比凯伦大。
第二个凯伦不应该在那里,正如@mellamokb 在 cmets 中指出的那样。
因此,您可以在 O(log N) 时间内对这棵树进行二分搜索,就像搜索排序数组一样。
【讨论】:
Karen,那么从Karen 左侧是Bob,然后从Bob 右侧是Tom,它将满足您的第一个条件,但不满足第二个条件。有必要将 BST定义为左/右子树中的所有节点都小于/大于父节点。
在您的示例中,它们表示每个名称中第一个符号的顺序。
如果你看到的话,从左到右的名字顺序是从 ABC 中的第一个字符到最后一个字符。
此外,凯伦名字的第二次出现还有一个特殊情况 - 如果输入相同的数据,此树中的默认行为是“向右移动”,那么 Karen 与 Tom 相比 -> K 是“更小”的 T,所以它从它离开。
无论如何,这里有一个更好的例子,从中你可以看到二叉树中的订单号: http://www.codeproject.com/Articles/4647/A-simple-binary-tree-implementation-with-VB-NET
【讨论】:
对于任何节点:
这提供了几个独特的属性
O(Log n) 时间到达目的地或不匹配的叶节点(在这种情况下,密钥不存在)。【讨论】:
我认为下面的这篇文章对你理解二叉树的概念很有帮助,它还提供了 C/C++ 和 Java 中的常见代码示例:
【讨论】: