Java 理解二叉搜索树计数

Java 理解二叉搜索树计数,java,recursion,binary-search-tree,dynamic-programming,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

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

以下是一个例子:

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;
}
这就是我如何理解这个方法的过程,也许有人能帮我理解我哪里出了问题

  • 从BTS对象从自身外部调用该方法;“tree.nodes()等”
  • 声明int leftNodes并将其设置为0
  • 如果有一个left节点(假设有),那么leftNodes的值将被分配给nodes()调用的返回值
  • 递归调用将再次通过nodes方法,将leftNodes再次赋值为零
  • 所以我不明白的是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值

    您应该考虑递归的结束

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

    left
    right
    都将是
    null
    ,因此您不会进行递归调用

    你会回来的

    leftNodes + rightNodes + 1; // 0 + 0 + 1 == 1
    
    leftNodes + rightNodes + 1; // 1 + 1 + 1 == 3
    
    现在,假设您有一个简单的树,它由根、左子级和右子级组成

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

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

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

    这是树中的节点数。

    这是顺序遍历的基本实现。对于每个节点,它将转到左子节点,直到没有剩余的左子节点为止(由于递归,就像在每次访问节点时将其推送到堆栈中一样)。然后对堆栈顶部重复相同的过程,直到堆栈中没有剩余的元素(再次注意,堆栈用于使事情比递归更简单)。执行此操作时,它基本上会将访问的每个节点的总和增加1。

    变量
    leftNodes
    righnodes
    是方法
    nodes()
    的局部变量,这意味着每个方法调用都有不同的变量实例


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

    +1
    部分是两个left的基本情况,正确和当前。它对子树中的每个节点调用一次,从而给出子树中的节点总数。如果left或right为null,则只为left或right返回0。