数据结构与算法【基础版】:4.5二叉树中节点的查找

链式存储的二叉树:

在这里插入图片描述
三种查找方式:

  • 前序:根左右
  • 中序:左根右
  • 后序:左右根

注:三种查找方式区别在于,找同一个值的时候,执行次数不同

代码:

1:测试类中先写好要遍历的树,然后写出对应的方法【其余代码看4.4】

		/**
         * 三次查找比较的次数不同
         */
        //前序查找
        TreeNode result = binTree.frontSearch(3);
        System.out.println("前序查找3和右节点的值是否相同:" + (result == rootR));
        //中序查找
        TreeNode result1 = binTree.midSearch(3);
        System.out.println("中序查找3和右节点的值是否相同:" + (result1 == rootR));
        //后序查找
        TreeNode result2 = binTree.afterSearch(3);
        System.out.println("后序查找3和右节点的值是否相同:" + (result2 == rootR));

2:创建二叉树(写出根节点对应的方法)

	public TreeNode frontSearch(int i) {    //前序查找
        return root.frontSearch(i);
    }

    public TreeNode midSearch(int i) {  //中序查找
        return root.midSearch(i);
    }

    public TreeNode afterSearch(int i) {    //后序查找
        return root.afterSearch(i);
    }

3:创建树节点(根据对应的方法,写出他的实现代码)

	public TreeNode frontSearch(int i) {    //前序查找
        TreeNode target = null;
        //对比当前节点的值
        if(this.value == i){
            return this;
        //当前节点的值不是要查找的节点
        }else {
            //查找左儿子
            if(leftNode != null){
                //有可能查到,也可能查不到,查不到的时候target还是一个null
                target = leftNode.frontSearch(i);
            }
            //如果不为空,说明在左儿子中已经找到了
            if(target != null){
                return target;
            }
            //查找右儿子
            if(rightNode != null){
                target = rightNode.frontSearch(i);
            }
        }
        return target;
    }

    public TreeNode midSearch(int i) {  //中序查找
        TreeNode target = null;
        //查找左儿子
        if(leftNode != null){
            //有可能查到,也可能查不到,查不到的时候target还是一个null
            target = leftNode.midSearch(i);
        }
        //如果不为空,说明左儿子总已经找到了
        if(target != null){
            return target;
        }
        //对比当前节点的值
        if(this.value == i){
            return this;
        }
        //查找右儿子
        if(rightNode != null){
            target = rightNode.midSearch(i);
        }
        return target;
    }

    public TreeNode afterSearch(int i) {    //后序查找
        TreeNode target = null;
        //查找右儿子
        if(rightNode != null){
            target = rightNode.afterSearch(i);
        }
        //如果不为空,说明左儿子总已经找到了
        if(target != null){
            return target;
        }
        //查找左儿子
        if(leftNode != null){
            target = leftNode.afterSearch(i);
        }
        //对比当前节点的值
        if(this.value == i){
            return this;
        }
        return target;
    }

结果:和我们推导的一样
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值