数据结构(15.2)二叉树
前言
树形结构是非线性数据结构的一种,在现实生活中有着广泛应用。其中,又以二叉树的应用最为常见。
二叉树是树型结构的一种,它规定每个结点至多只有两个子树,并且子树有左右之分,不能调换次序。
这意味着,二叉树只有五种基本的形态。
具体的概念和性质就不详细说了,下面说二叉树的存储结构。
二叉树的存储结构
如果使用顺序存储结构来存储二叉树,首先要约定存储顺序是从上至下、从左至右来存储每一个结点。假如结点不存在,则用特殊的标记(如0),来表示。
可以发现,结点即使不存在,也需要耗费空间去记录这个“不存在”的状态。很显然顺序存储结构在存储完全二叉树时才有比较好的性能;拿来存储一般的二叉树则容易造成空间上的浪费。因此通常使用链式存储结构来存储二叉树。
又到了熟悉的问题:结点如何设计?同往常的链式存储一样,结点包括了数据域和指针域两个部分。不同的是,指针域有两个指针,分别指向左右孩子结点。
//结点
typedef struct BinTreeNode{
//数据域
ElemType data;
//左孩子
struct BinTreeNode *leftChild;
//右孩子
struct BinTreeNode *rightChild;
}BinTreeNode;
对整棵二叉树来说,记录了根结点,就能找到所有的结点。因此,整棵树的结构里,只需要记录一个根结点就可以了。
但是,我们需要通过输入字符串来生成一棵二叉树,要有一个特殊的标记值来表示结点不存在,以便生成正确的二叉树。因此,表示整个二叉树的结点,除了要记录根结点以外,还要记录标记值。
//整棵树
typedef struct BinTree{
//根结点
BinTreeNode *root;
//停止的标记
ElemType refvalue;
}BinTree;
二叉树的初始化
初始化二叉树,就是将根结点初始化为空,同时设置结束标记