白沐沐vccc 2022-11-22 12:30 采纳率: 96.2%
浏览 4
已结题

java求二叉树总结点数 空指针问题

今天再做求二叉树总结点时,出现了空指针问题,十分差异
期初我是用this来判断这个结点是否为空,之后就报了空指针,但离谱的是我改为用this.left、this.right来判断该姐点是否为空,程序就正常了,但但这两种判断方法都一样怎么就报错了,感到很奇观,this和this.left同样指的是空节点,一个居然会报错

    public int getDepth(){
        if(this==null) return 0;
        int L=this.left.getDepth();
        int R=this.right.getDepth();
        return L+R+1;
    }

全部代码:

public class BinaryTreeDemo {
    public static void main(String args[]) {
        //先创建一个二叉树对象
        BinaryTree binaryTree = new BinaryTree();

//        创建结点
        HeroNode root = new HeroNode("宋江");
        HeroNode node1 = new HeroNode("张三");
        HeroNode node2 = new HeroNode("李四");
        HeroNode node3 = new HeroNode("王五");
        HeroNode node4 = new HeroNode("麻六");
//        建立结点关系
        root.setLeft(node1);
        root.setRight(node2);
        node1.setLeft(node3);
        node1.setRight(node4);
//        确认根结点
        binaryTree.setRoot(root);
        //输出
        System.out.println("前序查找:");
        binaryTree.preOrder();
        System.out.println("\n中序查找:");
        binaryTree.infixOrder();
        System.out.println("\n后序查找:");
        binaryTree.postOrder();
        binaryTree.getDepth();
    }
}

//定义BinaryTree 二叉树
class BinaryTree {
    HeroNode root;//定义根结点

    public void setRoot(HeroNode root) {
        this.root = root;
    }

    //前序遍历
    public void preOrder() {

        if (this.root == null) {
            System.out.println("当前二叉树为空,无法遍历");
        } else {
            this.root.preOrder();
        }
    }

    //中序遍历
    public void infixOrder() {

        if (this.root == null) {
            System.out.println("当前二叉树为空,无法遍历");
        } else {
            this.root.infixOrder();
        }
    }

    //后序遍历
    public void postOrder() {

        if (this.root == null) {
            System.out.println("当前二叉树为空,无法遍历");
        } else {
            this.root.postOrder();
        }
    }
//获取总结点数
    public void getDepth(){
        if(this.root==null){
            System.out.println("总结点数为0");
        }
        else{
          int deepth=this.root.getDepth();
            System.out.println("总结点数为:"+deepth);
        }
    }
}


//先创建HeroNode结点

class HeroNode {
    String data;
    HeroNode left;
    HeroNode right;

    public HeroNode getLeft() {
        return left;
    }

    public HeroNode getRight() {
        return right;
    }

    public void setRight(HeroNode right) {
        this.right = right;
    }

    public void setLeft(HeroNode left) {
        this.left = left;
    }


    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public HeroNode(String data) {
        this.data = data;
    }

    //前序查找方法
    public void preOrder() {
        //先输出父节点
        System.out.print(this.data + ' ');
        //递归向左遍历
        if (this.left != null) {
            this.left.preOrder();
        }
        //递归向右遍历
        if (this.right != null) {
            this.right.preOrder();
        }
    }

    //    中序遍历
    public void infixOrder() {
        //递归向左遍历(先左)
        if (this.left != null) {
            this.left.infixOrder();
        }
        //输出节点(后根)
        System.out.print(this.data + ' ');

        //递归向右遍历(再右)
        if (this.right != null) {
            this.right.infixOrder();
        }
    }

    //    后序遍历
    public void postOrder() {
        //递归向左遍历(先左)
        if (this.left != null) {
            this.left.postOrder();
        }

        //递归向右遍历(后右)
        if (this.right != null) {
            this.right.postOrder();
        }
        //输出节点(再根)
        System.out.print(this.data + ' ');
    }

    public int getDepth(){
        if(this==null) return 0;
        int L=this.left.getDepth();
        int R=this.right.getDepth();
        return L+R+1;
    }
}

  • 写回答

1条回答 默认 最新

  • Java大魔王 2022-11-22 14:25
    关注

    主要区别就在于this是判断当前节点,this.left或者this.right是判断当前节点的下一左或右节点


    你用this判断是否为空,,那么对于当前节点来说,能走到这的代码,this也就是当前节点肯定不为空。
    所以他又继续遍历下一个左或者右节点,但当前节点不为空,他的下一节点肯能是为空的,所以就会报空指针
    只有判断当前节点的下一左或者右节点是否为空,才能决定是否要继续遍历当前节点的下一节点

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日
  • 创建了问题 11月22日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分