笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历

在学习顺序存储结构之前要知道:
二叉树的结构是非线性的;
每一个结点可有两个后继。
对于这种一对多的层次结构,我们应该怎么样合理的存储下来呢?
二叉树既有顺序存储又有链式存储,今天先学顺序存储。
方法:
使用一组连续的存储单元来存放二叉树的数据元素。
使用结点之间的相对位置表示结点之间的关系。
对于满二叉树和完全二叉树来说,可以按照对满二叉树结点连续编号,将各结点数据存放到一组连续的存储单元中,将二叉树中编号为i的结点存放在数组的第i号元素中。
编号规则:
根结点的编号为1;对于编号为i的结点,
左孩子如果存在,则编号为2i;
右孩子如果存在,则编号为2i+1。
如果结点编号为i,则双亲的编号为i/2。
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

注意:空结点在存储时也一定要标出来,NULL。
这种情况显然会造成空间的浪费,因为存在空的存储位置。下面这个例子更明显,开辟了15个有效空间,但实际存储的有效元素只有4个。存储密度较低。
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

总结:顺序存储只适用于满二叉树和完全二叉树。
二叉树的遍历:
顺着某一条搜索路径巡访二叉树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。
将非线性化结构按照一定的规律变成线性化的序列。
由二叉树的定义可知:
二叉树的基本结构是由根结点、左子树和右子树三部分构成。左右子树也必须符合二叉树的定义。所以,二叉树本身也就符合递归的定义!
有三种遍历策略:
1.先上后下的层次遍历;
2.先左子树后右子树的深度遍历;
3.先右子树后左子树的深度遍历。
注意:下面的D代表根;L代表左子树;R代表右子树。
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

一、先序遍历的具体思想方法:
(对每一棵子树都采取先序遍历的方法,遍历时一定要遵循先左后右的原则。)
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

代码实现:
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

二、中序遍历的具体思想方法
先遍历左子树,再遍历根,最后遍历右子树。记住:每一个子树依旧采取中序遍历算法。
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

【笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历】笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

代码实现:
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

三、后序遍历的具体思想方法:
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

代码实现:
笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
文章图片

由此可以总结出:
所谓的先、中、后,其实就是根结点遍历的顺序,如果根结点先遍历,就是先序遍历;如果遍历左子树后再遍历根结点,就是中序遍历;如果根结点在左子树和右子树遍历结束后在遍历,就是后序。但对于左子树和右子树而言,一直是先左后右的原则!

    推荐阅读