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