当前位置: 首页 > 知识库问答 >
问题:

二叉树节点计算的递归方法

韩禄
2023-03-14

好的,我必须创建一个递归方法来计算树中的节点,我做到了(变量名是葡萄牙语的,对不起):

public int contaNos(Arvbin r) {
        Integer cardinalidade = 0;
        contaNosPrivado(r, cardinalidade);
        return cardinalidade;
}
private void contaNosPrivado(Arvbin r, Integer cardinalidade) {
        if (r==null) {
            return;
        }
        cardinalidade=cardinalidade+1;
        contaNosPrivado(r.esq, cardinalidade);
        contaNosPrivado(r.dir, cardinalidade);
        return;
}

arvbin是二叉树,esq和dir是对树分支的左右引用。

我以为这会奏效,但由于某种原因,当我尝试运行它时,它返回0。我使用了一些调试,我认为问题在于,当方法完成并返回到原始的非递归方法时,cardinalidade变量被设置为0。我不确定这是否是因为自动装箱会弄乱我的整数并将其转换为int,然后当我调用该方法时,它会传递一个值的副本,而不是对现有对象的引用,我不知道如何修复它。如果有人能帮忙,我将不胜感激

共有2个答案

孔君浩
2023-03-14

正如@John McClane所指出的,不能通过引用传递整数参数,只能通过值传递。

但也不需要私人助手方法,您可以将其简化为一个方法:

public int countLeaves( BinaryTreeNode n )
{
    return n == null? 0 : ( countLeaves( n.rightLeaf ) + countLeaves( n.leftLeaf ) );
}

或者(请原谅我可怜的葡萄牙语):

public int contaNos( Arvbin r )
{
    return r == null? 0 : ( contaNos( r.esq ) + contaNos( r.dir ) );
}
尹光辉
2023-03-14

问题是包装类在Java中是不可变的cardinalidade在这里只是contaNosPrivado的一个参数,不幸的是,它不能像其他对象类型参数那样充当参数,也就是说,这个局部引用不能更改初始引用的对象的内部字段。对它的任何更改只会以影响任何原始局部变量的方式影响它。

你的contanospivado中到底发生了什么:

>

cardinalidade=cardinalidade+1;

该对象首先被解除绑定到一个基本的int变量,该变量随后递增,最后结果被重新绑定到一个新的Integer对象中,该对象随后被分配到cardinalidade。即使使用“增量”操作符,也无法“增量”原始对象:

cardinalidade++;

要实现您的目标,请使用以下内容:

static int contaNosPrivado(Arvbin r) {
    if (r == null)
        return 1;
    else
        return contaNosPrivado(r.esc) + contaNosPrivado(r.dir);
}
 类似资料:
  • 我需要创建一个递归方法,将二叉查找树的根节点作为参数。这个递归方法将返回整个二叉查找树中内部节点总数的int值。 这就是我到目前为止所拥有的: 有没有更好的办法?我还坚持寻找迭代解。

  • 本文向大家介绍C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,包括了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: 希望本文所述对大家C++程序设计有所帮助。

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 我必须使用递归帮助方法来解决这个问题,而我完全是空白的 这是我目前所掌握的 尝试在建议后编辑:

  • 我坚持使用递归函数来查找二叉树中节点的深度,更具体地说,是在else条件中: 如果树是二叉搜索树,知道左子值总是低于父值,右子值总是高于父值,我可以添加一个If条件,这样如果节点x值低于根,我总是返回根- 当查看函数时,假设节点总是存在的,节点x永远不是根,并且在开始时传递的深度总是0。 如果树是二叉搜索:

  • 我读了一个算法来寻找二叉树中两个节点之间的距离。 这段代码在二叉树中找到(从根到给定节点的1个距离)。 我不明白的是,“x”有两个值,一个来自左子树,另一个来自右子树,它如何知道返回哪个值 例如,如果树类似于: 然后调用, 那么,在语句“”中,它如何返回正确的x值?