二叉树节点couting的递归方法

时间:2018-05-20 01:59:33

标签: java recursion binary-tree

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

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.我不确定是不是因为autoboxing正在弄乱我的整数并将其变成一个int,然后当我调用该方法时它传递的是值的副本而不是对现有对象的引用,我不知道如何修复它。如果有人可以提供帮助,我会非常感激

2 个答案:

答案 0 :(得分:1)

问题在于Java中的wrapper classes are immutablecardinalidade这里只是contaNosPrivado的一个参数,不幸的是,它不能像其他对象类型参数那样充当argument,即此本地引用不能更改初始引用的对象的内部字段指。对它的任何改变只会影响它影响任何原始局部变量的方式。

  

contaNosPrivado内部究竟发生了什么:

     
      
  1. 在调用时,确实提供了对Integer对象的引用。此引用分配给名为的局部变量   cardinalidade
  2.   
  3. 在这一行:

    cardinalidade=cardinalidade+1;
    
         

    此对象首先取消装入原始int变量,此变量随后递增,并且   最后,结果会重新装入 Integer对象中   然后分配到cardinalidade。没有办法增加'   原始对象,即使您使用增量运算符:

    cardinalidade++;
    
  4.   
  5. 任何进一步处理都适用于新创建的Integer对象,并且不会影响传递给contaNosPrivado的引用。
  6.   

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

static int contaNosPrivado(Arvbin r) {
    if (r == null)
        return 1;
    else
        return contaNosPrivado(r.esc) + contaNosPrivado(r.dir);
}

答案 1 :(得分:0)

正如@John McClane指出的那样,您无法通过参考传递Integer参数,只能通过传递。

但是也没有必要使用私有帮助器方法,你可以将它简化为单个方法:

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 ) );
}