计算树中的左子节点

时间:2011-03-21 17:58:12

标签: java data-structures tree nodes

我应该实现一个递归方法来计算左子树节点的数量。到目前为止我的代码是:

private int countLeftNodes(IntTreeNode node){
    int c = 0;
    if (node != null){
        c = 1 + countLeftNodes(node.left);
        countLeftNodes(node.right);
    }

    return c;
}

它返回的数字远小于应有的数字。我有一种感觉,我的遍历已关闭,因为它似乎只计算左边的子节点,然后终止。当我在大小为16的IntTree上调用此方法时,我应该得到8个左子节点,7个右子节点和一个根,但我得到4个左子节点。

5 个答案:

答案 0 :(得分:9)

您永远不会计算右侧树中的左侧节点。

private int countLeftNodes(IntTreeNode node)
{
    int c = 0;
    if (node.left != null)
    {
        c += 1 + countLeftNodes(node.left);
    }
    if(node.right != null)
    {
        c += countLeftNodes(node.right);
    }

    return c;
}

答案 1 :(得分:3)

要计算左子节点,您可以这样做:

private int countLeftNodes(IntTreeNode node) {

    // no tree no left-child nodes      
    if(node == null) {
       return 0;
    }

    // left-child count of current node.
    int c = 0;

    // does the current node have a left-child ?
    if (node.left != null){
      c = 1;
    }

    // return left-child count of current node +
    // left-child count of left and right subtrees
    return c + countLeftNodes(node.left) + countLeftNodes(node.right);
}

答案 2 :(得分:0)

private int countLeftNodes(IntTreeNode node){
    int c = 0;
    if (node != null){
        if(node.left!=null) {
           c = 1 + countLeftNodes(node.left);
        }
        if(node.right!=null){
            c +=countLeftNodes(node.right);
        }
    }

    return c;
}

答案 3 :(得分:0)

最容易检查父母的位置。

private int countLeftNodes(IntTreeNode node){

    int c = 0;
    if(node.left != null)
    {
        c++; 
        c+= countLeftNodes(node.left)
    }
    if(node.right != null)
    {
        c+= countLeftNodes(node.right);
    }

    return c;
}

答案 4 :(得分:0)

使用递归时我最喜欢的样式是使用某种类型的包装器函数,其中main方法调用另一种执行grunt工作的函数:

private int countLeftNodes(IntTreeNode node){
   int totalCount = reallyCountLeftNodes(IntTreeNode node, 0); 
   return totalCount;
}

private int reallyCountLeftNodes(IntTreeNode n, Int sum){
    if (n.left == NULL && n.right == NULL){  //check if we've hit rock bottom
        return sum;
    } else if (n.left == NULL) { //if the node's left is nil, go right
        reallyCountLeftNodes(n.right, sum++);   
    } else {
        reallyCountLeftNodes(n.left, sum++);  // Going as far left as possible!
    }
}

注意main函数如何调用另一个函数。我发现这种风格更清晰,更容易理解。此外,第二个函数有一个计数变量供您使用。