了解二叉搜索树计数

Sean2148:

我无法理解这是如何二叉树方法计算节点,我在很多例子在网上看了,但是我无法找到一个,这将解释究竟发生了什么。

下面是一个例子:

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的值将被分配给该调用的返回值的节点();
  4. 递归调用将再次通过节点的方法,分配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价值正在递归调用会增加吗?

他们是:

你应该想想递归的终点。

假设你有没有孩子一个节点。

双方leftrightnull,所以你将没有递归调用。

你会回来

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

现在,假设你有一个简单的树,它由根,左孩子和右孩子。

当你调用nodes()该树的根,都leftright不为空,所以我们会打电话给双方left.nodes()right.nodes()由于两个左右的孩子是叶节点(即他们没有孩子),对于递归调用返回1,以上解释的那样。

因此,当递归调用返回,我们会回来

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

这是我们的树节点的数量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章