此篇文章不解释二叉树的构造,只解释如何去实现二叉树(学完递归才能学二叉树)
1.二叉树的定义
二叉树用链表实现比顺序表实现要方便,因为顺序表实现会浪费空间。
二叉树有三个成员构成,val为此节点的值,left为指向左子树的指针,right为指向右子树的指针
2.二叉树的实现
下面图片是二叉树要实现的各种功能
2.1 二叉树的初始化
关于二叉树的初始化,有两种方法,第一种为纯手搓(自己创建节点并连接),第二种为递归
初始化成上面这种图
第一种方法:
创建与节点数对应的链表,并按照图片中的形状进行连接
第二种方法:
创建一个数组,用递归的方式进行连接
各位可以自己画画递归展开图。
2.2二叉树的销毁
关于二叉树的销毁,要从最下面的节点开始销毁
2.3二叉树前中后序的实现
前序:根 左子树 右子树
中序:左子树 根 右子树
后序:左子树 右子树 根
通过前中后序,可以实现二叉树的打印和其他功能
前序打印:
中序打印:
后序打印:
前中后序基本差不多。
2.4二叉树的节点个数
2.5二叉树的叶子结点个数
想获得二叉树的叶子节点个数,只需要递归到最下面一层,然后判断此节点的左右节点是否为空,如果左右子树为空,就说明这个节点就是叶子节点,上代码:
2.6二叉树第k层的节点个数
比如说:我想要第三层的节点个数
我们只需要不断递归,每向下递归一层,k就减1,直到最后,k = 1的时候,就说明这一层正是我们想要的
2.7二叉树的高度
想要统计二叉树的高度,就得把左右两边的高度统计完,如何在对比哪个更高,返回更高的即可
2.8二叉树查找值为x的节点
二叉树的查找我们只需要左右遍历,对比一下x的值是否相等,相等就返回即可,要注意接收返回值
注: 剩下两个功能实现需要队列
2.9二叉树的层序遍历
所谓的层序遍历就是先把一层的节点全部遍历完,再遍历下一层的节点,要实现这个功能,单单用二叉树是没办法实现的,所以这个层序遍历,我们要用队列+二叉树来实现
在原有的项目里面添加现有项即可(前提是以前做过队列),具体怎么实现层序遍历,我会在代码中一步步注释
3.0判断是否是完全二叉树
完全二叉树:所有的节点都是相邻的,中间没有NULL节点
非完全二叉树:所有的节点不一定相连,中间会有空节点(比如:5跟6中间就有一个空节点)
判断是否是完全二叉树,我们只需要把所有节点先放到队列中(包括NULL),然后一个个删除,遇到空就暂停,如果NULL后面还有节点,则说明不是完全二叉树
代码实现:
二叉树完!!!