在没有给定参数的情况下递归计算二叉树中的叶数

时间:2016-04-19 02:27:26

标签: java algorithm recursion

我正在努力弄清楚如何编写递归算法来计算二叉树(不是完整树)中的叶子数量。我走到最左边的叶子,不知道从那里返回什么。我试图通过将叶子加载到列表并获得该列表的大小来获得计数。这可能是一个不好的计算方法。

    public int countLeaves ( ) {

    List< Node<E> > leafList = new ArrayList< Node<E> >();
    //BinaryTree<Node<E>> treeList = new BinaryTree(root);

    if(root.left != null) 
    {
        root = root.left;
        countLeaves();
    }
    if(root.right != null) 
    {
        root = root.right;
        countLeaves();
    }
    if(root.left == null && root.right == null) 
    {
        leafList.add(root);
    }


        return();
}

2 个答案:

答案 0 :(得分:2)

阐述@dasblinkenlight的想法。您希望以递归方式调用根节点上的countleaves&amp;将#传回给来电者。以下几行。

public int countLeaves() {
 return countLeaves(root);
 }

/**
 * Recursively count all nodes
 */
private static int countLeaves (Node<E> node) {
 if(node==null)
   return 0;

 if(node.left ==null && node.right == null)
  return 1;
 else {
    return countLeaves(node.left) + countLeaves(node.right);
   }
}

编辑:看来,之前曾问过类似的问题counting number of leaf nodes in binary tree

答案 1 :(得分:1)

您的实现存在的问题是它不会将成员变量root的值恢复回进入该方法之前的状态。你可以通过将值存储在局部变量中来实现,即

Node<E> oldRoot = root;
... // your method goes here
root = oldRoot;

但是,更好的方法是将Node<E>作为参数,而不是依赖共享变量:

public int countLeaves() {
    return countLeaves(root);
}

private static int countLeaves (Node<E> node) {
    ... // Do counting here
}