Java 计算二叉搜索树的深度?

Java 计算二叉搜索树的深度?,java,recursion,depth,binary-search-tree,Java,Recursion,Depth,Binary Search Tree,我很难计算给定BST的深度总和[根的所有子级的各个深度之和]。我有树的节点总数,我试图计算树的平均深度,需要有这个深度总和 递归和我相处得不太好。。我发现这个问题很难解决。如果可能的话,我希望看到一个递归的解决方案 注: 我已经创建了accessors Node.getLeft()和Node.getRight()想想如果我在一张纸上向您展示了一张BST的图片,您将如何手工完成这项工作。在节点上时,需要跟踪哪些信息?如何计算给定节点的高度 从这里开始,尝试将其转换为伪代码,甚至直接转换为Java。

我很难计算给定BST的深度总和[根的所有子级的各个深度之和]。我有树的节点总数,我试图计算树的平均深度,需要有这个深度总和

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

注:


我已经创建了accessors Node.getLeft()和Node.getRight()

想想如果我在一张纸上向您展示了一张BST的图片,您将如何手工完成这项工作。在节点上时,需要跟踪哪些信息?如何计算给定节点的高度


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

想想如果我在一张纸上向您展示了一张BST的图片,您将如何通过手工完成这项工作。在节点上时,需要跟踪哪些信息?如何计算给定节点的高度


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

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


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

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


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

这是家庭作业吗?如果是这样的话,就把问题贴上这样的标签

您可以创建以下方法:

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

一旦你有了这个装置,你就可以通过树上孩子的数量来得到平均深度。

这是家庭作业吗?如果是这样的话,就把问题贴上这样的标签

您可以创建以下方法:

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

一旦你有了这个设备,你就可以通过树中的子节点数来获得平均深度。

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

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

现在有两种情况可以发生:

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

  • 或者它不是叶节点。在这种情况下,它将有1个或2个孩子。我们需要从我们的孩子那里得到深度报告,然后返回孩子们返回的深度总和

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


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

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

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

现在有两种情况可以发生:

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

  • 或者它不是叶节点。在这种情况下,它将有1个或2个孩子。我们需要从我们的孩子那里得到深度报告,然后返回孩子们返回的深度总和

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


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

因为这是家庭作业,我不想给你一个答案。相反,这里有一种递归方法来计算单链表的长度。希望这将以您能够理解的方式演示递归,并且您可以从中推断出解决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());
    }
}

既然这是家庭作业,我不想给你一个答案。相反,这里有一种递归方法来计算单链表的长度。希望这将以您能够理解的方式演示递归,并且您可以从中推断出解决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());
    }
}

这听起来很像家庭作业。到目前为止你写了什么?除了与递归“相处不好”之外,您在哪里陷入困境?所以用户不会在这里为你写出完整的解决方案。像这样的树问题真的可以