一、二叉树简介
一般树状结构在计算机内存中以链表存储,对于n元树,每个节点的分支度不相同,因此指针域必须为孩子节点最多的个数,每个节点的数据结构如下:
假设n元树有m个节点,那么此树共享了n*m个指针域,除树根外,每个非空链接都指向一个节点,因此空链接个数为 n*m-(m-1)=m*(n-1)+1,因此n元树的链接浪费率为 m*(n-1)+1 / m*n。
当n=2时,2元树的链接浪费率为1/2
当n=3时,3元树的链接浪费率为2/3
当n=4时,4元树的链接浪费率为3/4
……
当n=2时链接浪费率最低,因此最常使用二叉树结构来取代树状结构。
二叉树定义:是一个由有限节点所组成的集合,可以为空集合,或由一个树根及左右两个子树所组成。即每个节点最多只能有两个孩子节点。
数据结构如下:
与一般树的区别:
- 树不能为空集,但二叉树可以
- 树的分支度为d>=0,但二叉树最多为2个
- 树的子树间没有次序关系,二叉树必须考虑子树间的次序关系,如下图所示就是两棵不同的二叉树
二、二叉树存储方式
1、数组表示法
使用一维数组存储二叉树,将二叉树想象成一个满二叉树,数组第一个位置不用。对每层节点由从上到下、从左到右依次编号,分别将值存入数组所对应的编号的位置上。用数组来存储二叉树,越接近满二叉树越节省空间,若为歪斜树则非常浪费空间,增删数据较麻烦。
建立规则:小于父节点的值放在左子节点,大于父节点的值放在右子节点,这样可以确保左子树的值一定完全小于树根,右子树的值一定大于树根。
下来我们看一个以数组建立二叉树的实例。
例如我们用数据{6,3,5,9,7,8,4,2}按照以上规则建立的二叉树如下所示:
在内存中的情况为:
圆圈旁边的数字表示该节点在数组中的索引值,节点不存在的值为0。观察规律有,左子节点的下标是父节点下标的2倍,右子节点下标是父节点下标的2倍+1。
因此对于每个值,我们从根节点开始循环,