二叉树的创建和遍历
- 二叉树的创建
二叉树的创建是让我有点头疼的东西,因为我确实不太明白,但是让我写我却能较好的表达出来。
现在来试试如何创建一个二叉树
这是一个完全二叉树,其输入数组表达出来是这样的
[1,2,4,0,0,5,0,0,3,6,0,0,7,0,0]
其中0表示没有指向数值。所以这就是一个二叉树创建的样子
这个二叉树的创建的从左到右建立的,首先先确定头节点 1 然后确定1的左孩子2,这时候大家注意!!!并不是继续确定1的右孩子3而是确定2的左孩子4,从数组前三位,确定的是二叉树的头节点,头节点的左孩子(简称为2),2的左孩子4。然后数组第4、5位两个0,第一个是确定4的左孩子为空,那么意味着4没有左孩子,然后继续看4的右孩子,也就是数组第5位也是0,那么意味着4没有右孩子。所以4的这一节点结束了。
然后返回去看节点2,2的左孩子已经确定为4,在4没有左右孩子的情况下,数组第六位,也就是5为2的右孩子。那么数组中第七八位的两个零就意味着5没有孩子,5结束。
然后继续返回去,看头节点此时的右孩子还没有确定,然后数组第九位3就是为头节点的右孩子,然后确定3的左孩子,也就是6,然后6后面两个零也就是说6没有孩子。
然后返回去确定3的右孩子,就是7,然后两个0确定7没有孩子。二叉树建立完成。
那么如下图的二叉树数组如何表示呢?
也很简单,并不是很难。
如下:[A,B,0,D,0,0,C,E,0,0,0]
按如上思路思考一下,就能写出来。建立基本都是这么建立的。
- 二叉树的遍历
在遍历这个颗树之前,先在看看每个节点是怎么样的,在每个节点这个结构之中有三个东西,自身的值,指向左孩子的指针(java中的话就不是指针,是new一个节点),指向右孩子的指针。
图一七个节点,如下(表示[自身的值,左孩子,右孩子]):
1) [1,->2,->3]
2) [2,->4,->5]
3) [3,->6,->7]
4) [4,->0,->0]
5) [5,->0,->0]
6) [6,->0,->0]
7) [7,->0,->0]
1) 先序遍历
以第一个图为例:先序遍历顺序为:[1,2,4,5,3,6,7]
以第二个图为例:先序遍历顺序为:[A,B,D,C,E]
所谓先序是指最先输出自己的值,然后走左孩子路线,再走右孩子路线。
就以图一为例:节点一先输出自己的值,然后走左孩子路线,节点二输出自己的值,再接着走左孩子路线,节点四输出自己的值,然后节点四没有左右孩子,回去节点二,然后走节点二的右孩子路线,节点五输出自己的值,节点五没有左右孩子,回去节点二,节点二自己的值和左右孩子的值都输出完了,回去节点一,节点一输出完左孩子,走节点一的右孩子路线,到了节点三,节点三输出自己的值,节点三走自己的左孩子路线,节点六输出自己的值,节点六没有左右孩子,回到节点三,节点三再走自己的右孩子路线,节点七输出自己的值,节点七没有左右孩子,回到节点三,节点三自己的值和左右孩子都走完了,回到节点一。节点一自己的值和左右孩子都走完了,结束遍历!
2) 中序遍历
以第一个图为例:中序遍历顺序为:[4,2,5,1,6,3,7]
以第二个图为例:先序遍历顺序为:[B,D,A,E,C]
所谓中序是指最先走左孩子路线,然后输出自己的值,再走右孩子路线。
从节点一开始,先走节点一的左孩子,到节点二。到节点二先走节点二的左孩子,到节点四。节点四没有左孩子,输出节点四自身的值,然后节点四没有右孩子,回到节点二。节点二左孩子走完课,输出节点二自身的值,然后走节点二右孩子路线。节点五没有左孩子,节点五输出自己的值,节点五没有右孩子,回到节点二,节点二遍历完了,回到节点一。节点一左孩子走完了,输出自己的值,走右孩子路线,到节点三。节点三有左孩子,到节点六。节点六没有左孩子,输出自己的值,节点六没有右孩子,回到节点三。节点三左孩子走完了,输出自己的值,走右孩子到节点七。节点七没有左孩子,输出自己的值,节点七没有右孩子,回到节点三,节点三遍历完了,回到节点一。节点一遍历完了。结束遍历!
3) 后序遍历
以第一个图为例:后序遍历顺序为:[4,5,2,6,7,3,1]
以第二个图为例:先序遍历顺序为:[D,B,E,C,A]
所谓后序是指最先走左孩子路线,再走右孩子路线,然后输出自己的值。
从节点一开始,先走节点一的左孩子,到节点二。到节点二先走节点二的左孩子,到节点四。节点四没有左右孩子,输出节点四自身的值,节点四遍历完成,回到节点二。节点二左孩子走完,走右孩子路线,到节点五,节点五没有左右孩子,输出节点五的值,回到节点二。节点二左右孩子走完,输出节点二自己的值。节点二遍历完成,回到节点一。开始走节点一右孩子路线,到节点三,节点三有左孩子节点六,到节点六。节点六没有左右孩子,输出节点六自己的值。节点六遍历完成回到节点三,节点三有右孩子,到节点七。节点七没有左右孩子,输出节点七自己的值,节点七遍历完成,回到节点三。节点三左右孩子遍历完成,输出节点三自己的值,节点三遍历完成,回到节点一。节点一左右孩子遍历完成,输出节点一的值。遍历完成!
- 总结
生成和遍历二叉树并不是什么特别困难的事情,但是对于初学者而言,却做不到如何用编程语言实现二叉树,原因很简单,其中会用到递归思想,对代码的掌握程度。所有的大神都是从菜鸟过来的,没有谁一蹴而就。对于初学编程者而言,要知道我们是幸运的,因为编程是一门可以通过大量练习提高的技能。不断将自己逼入不舒适区会加快我们的学习和提升能力的速度。与君共勉,多敲代码,成就美好人生!
因为是第一次写二叉树的内容,如果大家有发现什么不对的,不足之处,还望指出!谢谢!