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

对二叉搜索树中的节点进行计数

安聪
2023-03-14

我需要创建一个递归方法,它将二进制搜索树的根节点作为参数。这个递归方法随后将返回整个二叉搜索树中节点总数的int值。

这是我目前所掌握的:

public class BinarySearchTree<E> extends AbstractSet<E>
{
protected Entry<E> root; 


//called by the main method
public int nodes()
{
    return nodes(root);
}       

//nodes() will count and return the nodes in the binary search tree

private int nodes(Entry<E> current)
{    
    if(current.element != null)
    { 
        if(current.left == null && current.right == null)
        {
            if(current.element == root.element)
            return 1;                   

            deleteEntry(current);              
            return 1 + nodes(current.parent);
        }
        else if(current.left != null && current.right == null)        
            return nodes(current.left);

        else if(current.left == null && current.right != null)
            return nodes(current.right);

        else if(current.left != null && current.right != null)
            return nodes(current.left) + nodes(current.right);      
    } else return 1;
    return 0;
}

main方法调用节点如下所示:

        System.out.println ("\nThis section finds the number of nodes "
             + "in the tree"); 

        System.out.println ("The BST has " + bst.nodes() + " nodes");

所以我是按顺序运行搜索的,一旦我到达一个没有子节点的节点,我就会删除当前节点,返回父节点并继续。我对上面的方法进行了调试,当程序最终计数并删除根节点左右两侧的所有节点并尝试返回1时,程序以NullPointerException()崩溃。

这是我的实验室,方法必须是递归的。

我在这一点上很迷茫,有没有人知道我做错了什么?

共有1个答案

龚鸿羽
2023-03-14

你把这条路弄得太复杂了。面向对象编程的基本思想是,您信任对象来完成它们知道答案的工作。所以如果我是一个家长,我可以数自己,我让我的孩子数自己,等等。

private int nodes(Entry<E> current) {   
  // if it's null, it doesn't exist, return 0 
  if (current == null) return 0;
  // count myself + my left child + my right child
  return 1 + nodes(current.left) + nodes(current.right);
}
 类似资料:
  • 我需要得到所有节点的x,y坐标,例如: X:使用顺序遍历访问节点之前已经访问的节点数 Y:节点从根开始的深度 例如对于节点15,x=5(15之前:已经访问过7, 8, 9, 10, 13),y=1(第二级) 树没有父指针 结果:x是错误的,y是正确的 打印: 结果: 我已经尝试过了(我认为这是不正确的,因为正确的子树遍历不计入节点) 结果是

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

  • 当删除具有两个子节点的节点时,如果指示使用标准的二叉搜索树节点删除算法,我们应该将其替换为右子树的最小节点还是左子树的最大节点?

  • 在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException

  • 我的任务是计算每个节点的深度,并将其存储在Node类中给出的“深度”中。但是我不知道我应该如何处理这个任务。我在互联网上寻找一些示例,但没有找到任何适合我的任务的示例。这是我给定的Node类的代码: 我以为我可以用类似的方法来计算树的高度,但是没有成功。有帮助吗?

  • 我对如何在二叉查找树中排列节点的顺序有点困惑。左边的二叉查找树中的子树节点能比根节点大吗? 例如,以下内容会是二叉搜索树吗? 上面让我困惑的是1(3)的右子树是否可以大于原始根节点(2)。