树的概念
树是由多个结点组成,每个结点所包含子节点的个数称为结点的度,度为0的结点称为树的叶子结点,度不为0的结点称为分支结点。
一起看下图:
上图中d,e,f为叶子结点,a,b下面分别有两个结点,那么a,b的度为2,c下面有一个结点,c的度为1,d,e,f的度为0.。
整棵树的度为所有结点中度最大的那个数。上图中数的度就为2,整棵树有三层,所以树的层次和深度分别为3。
一,树的表示方法
1,双亲表示法
第0为存储的数据为A,它没有父结点,所以A的parent为-1.
第1为存储数据B,它的父节点为A,A的下标为0,所以B的parent为0,
第三位存储数据C,C和B一样,下面的其它结点同理。
2,孩子表示法
孩子表示法每个结点的指针数为整棵树的度,所以不管每个结点下有几个孩子结点它都会有四个指针。
如图:
这棵树的度为2,所以每个结点都会有两个指针,但是这种方式比较耗空间,如果树 的度更大比如10,那么每个结点的指针数就为10,而有的结点下只有一个孩子结点,那么就会有九个指针空闲,所以还有另一种表示方法:
这种方法会相对节省空间,它会标明自己有多少个子结点,并开辟对应数量的指针空间。
3,双亲孩子表示法
这种表示方法结构类似于HashMap,树中的每个结点用线性表存储,每个结点的孩子结点用单向链表来存储,这种方法使用场景比较少。
4,孩子兄弟表示法
这种方法把每个结点分成左右指针,左指针指向孩子,右指针指向兄弟,这种方法使用场景同样比较少。
二,二叉树的分类
1,满二叉树
满二叉树为两边对称,数字连续的树,如上图1。
2,完全二叉树
完全二叉树为数字连续,后面可能缺少但仍然是连续的二叉树,如图2。
3,普通二叉树
普通二叉树没有规律,如图3。
三,二叉树的遍历
二叉树的遍历分为前序,中序,后续
前序(DLR)
Data Left Right这样看好理解一点,就是 中 左 右,遍历时先取出中间的再去找左边的直到左边的没有子结点了就取出左边最后一个值然后再找右边的。
如图,先取出1 ,然后找1左边的找到2,对于(2,4,5)这三个来说2为根节点,所以取出2,2左边还有子节点那就继续往左找,找到4,这时发现4左边没有子节点了那就取出4,然后返回到上一层(2这里),D和L都已经取出,接下来就找R,发现只有5,那么取出5,左边已经找完,返回上一层(1这里),开始往右找,发现3,取出,然后找3的左结点发现6,取出,找右结点为空,遍历结束,最后的遍历结果为:(1,2,4,5,3,6)。
中序(LDR)和 后序(LRD)的遍历逻辑和前序差不多,变换一下先取谁就可以了(中序先取左,然后中,然后右 后序先取左,然后右,然后中)。