树(Tree)
数据结构中的树和我们现实生活中的树非常像,从根部发散出枝丫。
看下面的结构:
node(1)
|
|——————————|——————————|
node(2) node(3) node(4)
| |
|——————————| node(7)
node(5) node(6)
数据结构是由各个节点组成的,分别包括:父节点、子节点、兄弟节点、根节点,这个很好理解,你看上图就能理解。
树中还有几个概念:高度(Height)、深度(Depth)、层(Level)
高度=节点到叶子节点的最长路径(边数)
深度=根节点到这个节点所经历的边的个数
层数=节点的高度+1
树的高度=根节点的高度
了解了树的基本概念,我们再来看二叉树。
二叉树
每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。
二叉树有两种特殊情况:满二叉树和完全二叉树。
满二叉树:除了最后一层是叶子节点,所有节点都有左右子节点,这样就形成了完整的一个二叉树,没有高度差(即不会出现节点之间高度不一样的情况)。
完全二叉树:除了最后两层是叶子节点(即高度差只有一层),所有叶子节点如果只有一个,都靠左排列。
存储方法
存储一棵二叉树,有两种方法:
一种是基于指针或者引用的二叉链式存储法
一种是基于数组的顺序存储法。
链式存储法:基于链表存储,简单、直观,通过左右指针,表示节点的左右子节点。
data(left,right)
| |
data(l,r) data(l,r)
| | | |
data(l,r) data(l,r) data(l,r) data(l,r)
顺序存储法:基于数组,需要通过下标计算,映射节点到对应位置。存储方式:把根节点存储在下标= 1 的位置,那根节点的左子节点存储在根节点下标* 2 = 2 的位置,右子节点存储在根节点下标* 2 + 1 = 3 的位置,以此类推。
data(1)
| |
data(2) data(3)
| | | |
data(4) data(5) data(6) data(7)
如果是满二叉树和完全二叉树,则可以用顺序存储法,因为基本不会有太多空出来的位置。
如果不是满二叉树和完全二叉树,则可以用链式存储法,因为这样可以节省空间。
二叉树的遍历
有三种,前序遍历、中序遍历和后序遍历。
如果要打印二叉树,使用递归是最合适的了。