二叉树是一个很重要的存储结构,所以和大家分享一下我对二叉树的理解并结合代码,希望让大家都能对二叉树有一个最清晰的认识
首先,二叉树是每个节点最多有两个子树的树结构,这是二叉树的定义,二叉树的结构如下图
可以看到二叉树必要的是根节点,也就是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*等等,在后续我会为大家分享更多关于二叉树的知识,希望和大家共同进步,如有疑问或者纠正,请直接留言,我会第一时间答复