【问题标题】:Calculate the depth of a binary search tree?计算二叉搜索树的深度?
【发布时间】:2010-12-24 23:46:14
【问题描述】:

我在计算给定 BST 的深度总和 [根的所有子节点的单个深度的总和] 时遇到困难。我有树的节点总数,我正在尝试计算树的平均深度,需要我有这个深度总和。

递归和我相处得不是很好。我发现这个问题非常困难。如果可能的话,我希望看到一个递归解决方案。

注意:

我已经创建了访问器 Node.getLeft() 和 Node.getRight()

【问题讨论】:

  • 这听起来很像家庭作业。到目前为止你写了什么?除了你与递归“相处得不好”之外,你在哪里卡住了? SO 用户不是在这里为您写出完整的解决方案。
  • 像这样的树问题除了递归之外真的无法解决。其他解决方案往往更复杂、更难阅读、更难维护。
  • @dribeas 我不认为你可以,因为它只是一些任意的 BST。你如何扎根树最终将决定平均值是多少。
  • 从长远来看,将作业问题外包给 StackOverflow 并不会节省任何时间。
  • 仅作记录,我相信这可以在 Haskell 的一行中解决:D

标签: java recursion depth binary-search-tree


【解决方案1】:

您只需要在遍历树时保留一个深度计数器(如果需要,请查找树遍历)并在每次到达节点时添加计数器的值。然后除以节点数。

这看起来像家庭作业,所以我没有提供更详细的解决方案。

【讨论】:

    【解决方案2】:

    考虑一下,如果我在一张纸上向您展示了一张 BST 的图片,您将如何以规范的方式手动完成此操作。当您在一个节点上时,您需要跟踪哪些信息?如何找到给定节点的高度?

    从这里开始,尝试将其转换为伪代码,甚至直接转换为 Java。如果您遇到问题,请随时发表评论,以便用户可以帮助您。

    【讨论】:

      【解决方案3】:

      这是作业吗?如果是这样标记问题。

      您可以创建一个方法:

      • 具有节点引用和深度作为参数
      • 增量深度
      • 如果节点不是子节点,则递归调用左右并相应地更新总和
      • 否则返回总和 + 深度

      一旦你有了这个除以树中孩子的数量来获得平均深度。

      【讨论】:

        【解决方案4】:

        我们需要访问所有叶节点并计算它们的深度。这表明:

        给你的节点访问函数一个额外的参数。它不仅需要知道它要去哪里,还需要知道它有多深。每次调用它时,它都会被调用更深,因此您的节点访问者只需增加它从调用者那里获得的深度数。

        现在可能会发生以下两种情况之一:

        • 您找到的任何一个节点都是叶节点,即它没有任何子节点;在这种情况下,您的访问者需要将其深度返回给调用者。是的,它只是返回它从调用者那里得到的数字,+ 1。

        • 或者它不是叶节点。在这种情况下,它将有 1 个或 2 个孩子。我们需要将孩子们的深度报告返回给调用者,所以只需返回孩子们返回的深度总和。

        通过递归的魔力,返回给根的访问者的数字将是所有孩子的深度之和。

        要获得平均深度,您需要将其除以叶节点数;我将留给第二次遍历来计算。可以一次性完成,但会稍微复杂一些。

        【讨论】:

        • 您能否扩展“或者它不是叶节点。在这种情况下,它将有 1 个或 2 个子节点。我们需要将这些深度报告从我们的子节点返回给调用者,所以只返回孩子返回的深度总和。”?我不明白你的确切意思。我们如何返回孩子返回的深度之和?
        • 您的访问者函数,无论使用何种语言,都可以将一个数字返回给它的调用者。我告诉你如何在每种情况下计算这个数字。对于非叶节点,它将为一个或两个子节点调用自己,并且这 1 或 2 个调用中的每一个都将返回一个数字。如果有 2 个孩子,则返回总和,否则只返回你得到的一个数字。
        【解决方案5】:

        既然这是作业,我不想只给你一个答案。相反,这是一种计算单链表长度的递归方法。希望这将以您可以理解的方式演示递归,并且您可以从那里推断以解决您的 BST 问题。

        public final class LL {
            public final int value;
            public LL next;
        
            public LL(final int value) {
                this.value = value;
            }
        
            public void add(final int value) {
                if (null == next) {
                    next = new LL(value);
                } else {
                    next.add(value);
                }
            }
        
            /**
             * Calculate the length of the linked list with this node as its head (includes this node in the count).
             *
             * @return the length.
             */
            public int length() {
                if (null == next) {
                    return 1;
                }
                return 1 + next.length();
            }
        
            public static void main(final String... args) {
                final LL head = new LL(1);
                head.add(2);
                head.add(3);
                System.out.println(head.length());
                System.out.println(head.next.length());
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-08
          相关资源
          最近更新 更多