【问题标题】:Binary search tree with strings带字符串的二叉搜索树
【发布时间】:2015-01-16 19:54:56
【问题描述】:

我有一本书以一种非常糟糕的方式解释了二叉搜索树背后的理论级别。

以这个字符串树为例:

(对不起我的油漆)这个例子直接取自我的书:)

有人可以向我解释一下顺序吗?这背后的逻辑是什么?

【问题讨论】:

  • 如果示例树中确实有两个 Karen 节点,那么从技术上讲它不是 BST,因为不允许重复节点。

标签: binary-tree binary-search-tree


【解决方案1】:

在 BST 中,每个节点最多有一个左孩子和一个右孩子。给定节点左侧的每个节点都小于它,而给定节点右侧的每个节点都大于它。这样做的后果之一是你不能有重复的值,所以我不确定这个例子是否正是这本书的内容。

在您的示例中,字符串按字母顺序排列。以根节点为例,Bob 在 Karen 之前,所以 Bob 在 Karen 的左边。汤姆在凯伦之后,所以汤姆在凯伦的右边。从整个树来看,您可以看到 Karen 左侧的每个节点(Bob、Alan、Ellen)按字母顺序排在 Karen 之前,而 Karen 右侧的每个节点(Tom、Wendy)按字母顺序排在 Karen 之后。无论你看哪个节点,这个模式都是一样的。

【讨论】:

  • '小于'在这种情况下意味着'按字母顺序排列'。
  • 查看我对@irrelephant 回答的评论。每个节点的左边都是 parent 不足以定义BST。如果没有将每个节点的左/右 子树 定义为小于/大于父级,则您的第三句话不一定从第二个和第一句话开始。
  • 很公平,我应该更详细地解释一下。我会更新的。
  • '小于'也可以称为'字典比较'en.wikipedia.org/wiki/Lexicographical_order
【解决方案2】:

对于任何节点(例如,Karen - 根),左子树(Bob、Alan、Ellen)中的每个节点在字典上都小于 Karen,而右子树中的每个节点 ( Tom, Wendy) 比凯伦大。

第二个凯伦不应该在那里,正如@mellamokb 在 cmets 中指出的那样。

因此,您可以在 O(log N) 时间内对这棵树进行二分搜索,就像搜索排序数组一样。

【讨论】:

  • 第二个不一定跟随第一个。例如,如果根是Karen,那么从Karen 左侧是Bob,然后从Bob 右侧是Tom,它将满足您的第一个条件,但不满足第二个条件。有必要将 BST定义为左/右子树中的所有节点都小于/大于父节点。
【解决方案3】:

在您的示例中,它们表示每个名称中第一个符号的顺序。

如果你看到的话,从左到右的名字顺序是从 ABC 中的第一个字符到最后一个字符。

此外,凯伦名字的第二次出现还有一个特殊情况 - 如果输入相同的数据,此树中的默认行为是“向右移动”,那么 Karen 与 Tom 相比 -> K 是“更小”的 T,所以它从它离开。

无论如何,这里有一个更好的例子,从中你可以看到二叉树中的订单号: http://www.codeproject.com/Articles/4647/A-simple-binary-tree-implementation-with-VB-NET

【讨论】:

    【解决方案4】:

    对于任何节点:

    1. 左分支中的所有内容都按字母顺序排列
    2. 右分支中的所有内容都按字母顺序排列 > 当前节点。

    这提供了几个独特的属性

    1. 您可以通过简单地向左或向右移动来找到任何节点,具体取决于您正在搜索的键在字典上是 而不是当前节点。您将在O(Log n) 时间到达目的地或不匹配的叶节点(在这种情况下,密钥不存在)。
    2. 按顺序遍历按字母顺序提供所有键。

    【讨论】:

      【解决方案5】:

      我认为下面的这篇文章对你理解二叉树的概念很有帮助,它还提供了 C/C++ 和 Java 中的常见代码示例:

      http://cslibrary.stanford.edu/110/BinaryTrees.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        相关资源
        最近更新 更多