了解二进制搜索树计数

时间:2019-02-18 11:23:51

标签: java recursion binary-search-tree dynamic-programming

我很难理解这种二叉搜索树方法是如何计算节点的,我在网上看了很多示例,但是找不到一个可以确切解释正在发生什么的例子。

这里是一个示例:

public int nodes() {
    int leftNodes = 0;

    if (left != null) {
        leftNodes = left.nodes();
    }
    int rightNodes = 0;

    if (right != null) {
        rightNodes = right.nodes();
    }
    return leftNodes + rightNodes + 1;
}

这就是我对这种方法的理解,也许有人可以帮助我了解我要去哪里。

  1. 该方法是从BTS对象自身之外调用的; “ tree.nodes()等”。
  2. int leftNodes被声明并设置为0。
  3. 如果有一个左节点(假设有),则将leftNodes的值分配给对nodes()的调用的返回值;
  4. 递归调用将再次通过nodes方法,再次将leftNodes分配为零。<​​/ li>

所以我不明白的是,leftNodes变量在哪里递增?似乎只是再次遍历该方法,但该值没有改变,从我的角度来看,leftNodes和rightNodes始终为0。

我发现了另一个BTS计数示例,该示例使用C ++

int CountNodes(node*root)
{
if(root==NULL)
    return 0;
if(root->left!=NULL)
{
    n=n+1;
    n=CountNodes(root->left);
}
if(root->right!=NULL)
{
    n=n+1;
    n=CountNodes(root->right);
}
return n;
}

我发现此方法更容易执行,因为每次找到一个节点时n都会明显增加。

我的问题是在递归调用中如何增加leftNodes / rightNodes的值?

3 个答案:

答案 0 :(得分:3)

您应该考虑递归的结束。

假设您有一个没有子节点的单个节点。

leftright均为null,因此您不会进行递归调用。

你会回来的

leftNodes + rightNodes + 1; // 0 + 0 + 1 == 1

现在,假设您有一棵简单的树,该树由一个根,一个左孩子和一个右孩子组成。

当您为树的根调用nodes()时,leftright都不为空,因此我们将同时调用left.nodes()和{{1} }。由于左右两个子节点都是叶节点(即它们没有子节点),因此如上所述,对这两个子节点的递归调用将返回1。

因此,当递归调用返回时,我们将返回

right.nodes()

这是我们树中的节点数。

答案 1 :(得分:2)

变量leftNodesrightNodes对于方法nodes()是局部的,这意味着对于方法的每次调用,这些变量都有不同的实例。

因此,当您递归调用方法(例如,以left.nodes()进行调用时,在递归调用之前和之后,leftNodes的值是相同的,因为它(该调用)将具有它的一个实例leftNodes(和rightNodes)。

答案 2 :(得分:1)

这是inorder traversal的基本实现。对于每个节点,它将转到左子节点,直到没有剩余的左子节点为止(由于递归,请像在每次访问节点时那样将其推入堆栈)。然后,它对堆栈的顶部重复相同的过程,直到堆栈中没有剩余元素为止(再次注意,与递归相比,使用Stack可以使事情更简单)。在这样做的同时,它基本上会将访问的每个节点的总和增加一。