二叉树及其遍历

二叉树是一个很重要的存储结构,所以和大家分享一下我对二叉树的理解并结合代码,希望让大家都能对二叉树有一个最清晰的认识

首先,二叉树是每个节点最多有两个子树的树结构,这是二叉树的定义,二叉树的结构如下图

可以看到二叉树必要的是根节点,也就是A,每个节点都会有左子节点和右子节点,那么从B开始看,它又是一个二叉树,所以B也叫作A的左子树,同理C叫作A的右子树

了解到这些以后,我们就可以实践写一棵二叉树了,下面是我写的一个小demo


从这个BTree的类可以看到,一颗BTree,一定要有左子树,右子树,至于k和v是我们用来获取该节点的值所用的,这里我重写了toString方法,目的在于输出以后可以通过json的形式明了的向大家展示树结构

二叉树定义完了,我们要再写一个二叉树的工具类,我这里命名为BTreeUtil,我们看下面的代码

这个工具类包括获取某个节点的value,增加节点,以及前序,中序,后序三种遍历,我们首先看增加节点,下面是代码片段


可以看到第43行,如果树为空,我们就new一个然后返回

第46行我把传入树的根节点与要增加的节点做了一个比较,如果相等,那么直接替换这个节点的值,如果要增加的的节点小于该树的根节点,则取该树的左子树进行递归,直到没有该节点或者等于该节点,同样如果该节点大于该树的根节点则用该树的右子树继续进行递归,直到没有该节点或者等于该节点。我们写个test类测试一下


首先构造BTree,创建根节点,然后使用工具类进行节点增加,然后我们打印一下树,得到树里面的数据,而后我放到json查看工具里,是下面的样子


可以看到12是根节点,他的left是8,right是19,8的left是5,8的right没有,5的left是3,5的right是6,19的left是15,19的right是21,就是下面这个样子


我们已经创建了一棵树,下面我们获取一下树上面的节点,看下代码


同样适用递归,如果树是空的,则没查询到,返回null,如果不为空,比较树的根节点和传入的key的大小,如果等于则命中,返回当前树,如果key小于根节点,则适用树的左子树进行递归,如果key大于根节点则适用树的右子树进行递归,直到找到等于或查询不到

我们看下test类


可以看到通过3我们可以找到以3为根节点的树,他的value就是我们要找的该节点的值,为t3

最后我们看一下二叉树的遍历,先引入一下概念

前序遍历: 

    1.访问根节点 

    2.前序遍历左子树 

    3.前序遍历右子树 

中序遍历: 

    1.中序遍历左子树 

    2.访问根节点 

    3.中序遍历右子树 

后序遍历: 

    1.后序遍历左子树 

    2.后序遍历右子树 

    3.访问根节点

直接看代码吧


完全按照概念所描述的,分别在最开始,中间,最后遍历二叉树,我们看下test类


我们可以发现中序遍历,其实是有序的输出了二叉树的值


以上就是二叉树的简单介绍,二叉树有很多,例如红黑树,B+,B*等等,在后续我会为大家分享更多关于二叉树的知识,希望和大家共同进步,如有疑问或者纠正,请直接留言,我会第一时间答复




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值