树形结构
数使一个非线性结构,他是由n个结点组成的具有一定层次关系的集合,叫做树是因为他像是一颗倒挂的树,根在上,叶子在下,具有一些性质
1,有一个特殊节点叫做根节点,他没有钱去节点(向上没有节点)
2,除开根节点外,其他的节点被分成n个互不相交的集合,每个集合的根节点只有一个前驱,但是可以有0个或者多个后驱
3,树使递归定义的
在树形结构中不能存在一个子节点被俩个根节点连接的情况,也就是一个节点只能有一个前驱
树的概念
节点的度:是一个节点所连接子树的数量,对a来说,他连接了6个字数所以他的度为6
树的度:一棵树的度的最大值 这里最大的度为a所以树的度为6
叶子节点或终端节点:该结点的度为0,这里b,c,h,i...都是叶子
双亲节点或者是父节点:该节点对应的前驱,b的父节点就是a,根节点没有父节点
孩子节点或者是子节点:该节点对应的后驱节点称为其的子节点,如图b是a的子节点
根节点:一个树中没有父节点的节点,也就是a
节点的层数:从节点开始,将根节点记为第一层,根的子节点就是第二层这样以此类推,这里h在第三层
树的高度和深度:书中节点的最大层数,p所在就是最大层数4层,所以树的高度为4
---了解
非终端节点或分支节点:度不为0的节点,a,d,e...都是非终端节点
兄弟节点:有同一个父节点的节点互称为兄弟节点
堂兄弟节点:节点的夫节点在同一层,那么这写节点互称为堂兄弟节点
节点的祖先:每个分支最终向上直线的点,也就是根节点 a
子孙:以某节点为根的树的所有子节点都可以被称为该节点的子孙,这里所有的节点都是a的子孙
森林:有m棵不同相交的树组成的集合为森林
二叉树
二叉树一个父节点最多有俩个子节点,left和right
一个二叉树的度不能超过2,且他的子树有左右之分不能颠倒,所以二叉有序树
对于二叉树,只要是树的度不超过2那么就是二叉树
俩种特殊的二叉树
满二叉树
一个二叉树他的每层的节点的节点数都达到最大值,那么这个树就是满二叉树,那么就有如果一个满二叉树的层数为k,那么他的节点数就是(2^k)-1
完全二叉树
又满二叉树引出来的,是一种效率很高的数,对于有k层n个节点的完全二叉树,他的节点对应的编号和深度为k的满二叉树对应的编号一一对应,这样称为完全二叉树
这样的不能称为是完全二叉树
二叉树的性质
1. 若规定根节点的层数为1,那么第i层最多能储存的节点个数为2^(i-1)
2. 若根节点的层数为1,那么深度为k的二叉树最多能储存的节点的个数为(2^k)-1
3. 对于任意一颗二叉树,若他的叶子节点的个数为n0,度为2的节点个数为n2 那么就与
n0 = n2 +1
4. 具有n个节点的二叉树的深度为 log(n+1)向上取整,也就是若n为510个 log511向上取整为521
对2去对数也就是9层
5. 对于具有n个节点的二叉树,若按上到下,从左到右一次编号,对与编号为i的节点就有
若 i > 0,双亲序号(父节点)i / 2,i = 0 为根节点,无父结点
若2i +1 < n,i 对应的左孩子序号为2i + 1,否者无左孩子
若2i + 1 < n,i 对饮的右孩子序号为2i + 2,否者无右孩子
二叉树的代码实现
二叉树的链式储存有俩种
孩子表示法
孩子双亲表示法
二叉树的基本操作
二叉树的遍历
前序遍历 preOrder
先打印根节点 --> 左节点 --> 右节点
代码实现
该遍历是先往左一直走,直到走到了null,然后右走到左节点,可以使用递归的思想,先向左一直递归,直到null返回,这是左边就走完了,这时再退到4这个节点,再走到4这个节点的右边,这时又是空那么这时这个4这个方法也就走完了,那么这时递归也就退到了2这个节点,然后走到这个节点的右节点,就这样前序遍历就设计出来了
中序遍历
先打印左节点 --> 根节点 --> 右节点
中序遍历也就是再吧左节点走完了才去打印左节点4,然后走到右节点null,退出,递归回退到了2
这时走到2的右节点5,5的做节点为空,打印5,再走到5的右节点null,回退到了3这样递归下去
后序遍历 postOrder
先打印左节点 --> 右节点 --> 根节点 也就时要把左右节点都走完,这时才能打印,4这个节点的左右null都走完,然后回退打印4,回退到2,走到2的右节点5,5的左右节点null走完,打印5
回退到2 打印2 这样递归
获取二叉树的高度 getHeight
二叉树的高度是一条最长的链
这次需要比较每个节点的左右高度
先递节点的左右节点,节点1左右节点2 3,都是先递归左边,递到2 的左右节点 4 5,4 的左右节点null 返回0,这时4这个节点就算是递归完了,返回1再递到5的左右节点 null 81 ,81 的左右节点 null 8,8的左右节点null 这时8递归完了,返回1,接着81也递归完了返回2(1+1),因为需要加上每次返回的值
接着5也递归完了,返回会3,这时4返回的是1,5返回的是3,5节点返回的值大于4节点,最终2的返回值也即是5节点的值加一4 ,这样树的递归也就写出来了
找到某个数是否存在 find
建立的二叉树是无序的那么秩序要前序遍历每个节点找到对应的节点就可以了
获得的叶子个数 getLeafCount
创建一个全局变量LeafCount记录叶子的个数,然后再遍历整棵树,如果该节点的左右都为空,那么leafCount++,最后遍历完了就返回leafCount,和前序遍历大差不差
每个节点遍历了都要判断所以需要写俩次比较
END