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

通过递归确定整数二叉树的大小

胡夕
2023-03-14

我有类BinaryTreeNode(int值)及其左子级和右子级,BinaryTree(int rootVal)具有BinaryTreeNode根,rootVal作为其值。我开发了一个代码来计算树中的节点数(在类BinaryTreeNode中),但由于NullPointerException,它不起作用:

public int size(){
    if(this == null) {    // base case
        return 0;
    } else {
        return 1 + left.size() + right.size();
    }
}

然而,我发现了另一个具有类似策略的解决方案:

public int size(BinaryTreeNode refNode){
    if(refNode == null) {    // base case
        return 0;       
    } else {
        return 1 + size(refNode.left) + size(refNode.right); 
    }
}

我已经理解了为什么我的代码会抛出异常(因为left/right会指向null)。但是我想知道为什么第二种解决方案的原理几乎是一样的。提前感谢!

共有3个答案

夏何平
2023-03-14

this在正在运行的类中永远不能为null。您将获得一个NPE,因为左==null右==null的节点将无法调用size()代码,因为指针没有引用任何内容。

也许您的代码应该更具防御性,并在尝试检索它们的大小之前检查子级是否为空:

public int size() {
    int total = 1;
    if (left != null)
        total += left.size();
    if (right != null)
        total += right.size();
    return total;
}
邰勇军
2023-03-14

基本案例的组织方式错误;在当前实例上检查<code>null

public int size(){
    int sizeLeft = 0;
    if (this.left != null)
        sizeLeft = left.size();
    int sizeRight = 0;
    if (this.right != null)
        sizeRight = right.size();
    return 1 + sizeLeft + sizeRight;
}
端木澄邈
2023-03-14

在第一个示例中,您尝试在检查<code>null</code>之前找到大小:

你先打电话

left.size()

然后在 size() 方法中检查,以查看您刚刚调用该方法的对象是否为 null

if(this == null) {    // base case
    return 0;
...

因此,如果< code>left为< code>null,您将在进入< code>size()方法之前获得NPE。

这里要记住的主要事情是,this永远不能是null。如果是,您首先就不能在其上运行方法。所以您实际上并没有像您想象的那样在null案例上终止递归。

< br >

在第二个步骤中,首先检查< code>null:

如果refNode.left在此处为< code>null

    return 1 + size(refNode.left) + size(refNode.right); 

size()方法进行预检查

if(refNode == null) {    // base case
    return 0;
...

并安全地返回0

< br >

您可以通过在每个分支上显式地将空检查放在第一个方法来使第一个方法工作:

public int size(){
    return 1 
        + left == null ? 0 : left.size()    // check for null first
        + right == null ? 0 : right.size(); // check for null first
}
 类似资料:
  • 我正在研究二叉树。我在网上看到了一个遍历整个二叉树的代码。这是我得到的代码:“” “‘ 我不明白的是这个函数如何打印正确的孩子?根据代码每次调用函数时,左子被打印出来。代码永远不会到达正确的孩子。

  • 主要方法: 如果您需要类'BinaryNode',请询问,我会张贴它,我不想用代码交换这个问题... 输入: null null 我不明白为什么节点'2'和'3'返回时左值和右值为null。

  • 很长一段时间以来,我一直在解决这项任务。我需要编写一个递归函数来检查每个节点是否小于其任何子节点。如果二叉树是最小堆,则返回 true,否则返回 false。 到目前为止我所拥有的:

  • 我需要编写伪代码来检查有效的二叉树是否是搜索二叉树。 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题。 我需要更新数组的索引,以便按照值在树上的顺序将其提交给数组。 我不确定在递归过程中索引是否真的得到了正确更新。。到底是不是?如果你发现问题,能帮我解决吗?谢谢 伪代码 第一功能 IsBST(节点) 大小← 树化(节点

  • 本文向大家介绍数据结构 二叉树的递归与非递归,包括了数据结构 二叉树的递归与非递归的使用技巧和注意事项,需要的朋友参考一下 数据结构 二叉树的递归与非递归 实例代码:  先序遍历(递归法)   后序遍历      感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 问题内容: 您好,我正在尝试编写一种非递归方法来获取节点的大小,因为Java中的递归非常昂贵。这将包括子节点的数量+ 1(自身)。我已经转换了C实现,如何以非递归方式获取二叉树中的叶节点数量?进入Java,但这是不正确的。 编辑:非递归计算二进制树大小的算法。 问题答案: 您的算法正在计算 叶节点 。您自己的愿望是计算 所有 节点。对叶节点进行计数的算法仅在弹出叶节点时才添加到计数器,这对于Jav