基本概念
树的度—— 一棵树中最大的结点度数
双亲—— 孩子结点的上层结点叫该结点的双亲
兄弟—— 同一双亲的孩子之间互成为兄弟
祖先—— 结点的祖先是从根到该结点所经分支上的所有结点
子孙—— 以某结点为根的子树中的任一结点都成为该结点的子孙
结点的层次—— 从根结点算起,根为第一层,它的孩子为第二层……
堂兄弟—— 其双亲在同一层的结点互称为堂兄弟。
深度—— 树中结点的最大层次数
有序树—— 如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
森林—— m(m0)棵互不相交的树的集合
二叉树的存储结构
3.1 ①顺序存储结构 ②链式存储结构
(1)顺序存储结构
实际上就是用一个一维数组按照自上而下,自左至右的将每一层的结点放入数组中。
(2)链式存储结构
实际上就是一个链表,链表的结点至少得包含三个域:数据域和左右指针域(为了方便找到结点的双亲,还可以在结点的结构中增加一个指向其双亲结点的指针域)
二叉树的链式储存如下
typedef struct BiTNode{
TElemType data; //结点的数据域
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
二叉树的遍历
三种遍历方式:
①先序遍历(根左右)②中序遍历(左根右)③后序遍历 (左右根)
(1)先序遍历:1.访问根结点 2.先序遍历左子树 3.先序遍历右子树
如图的先序遍历为:ABDGCEF
void preOrder(BitTree t) //先序遍历
{
if(t) //树不为空
{
visit(t->data ); //访问节点数据,自定义访问函数visit
preOrder (t->lchild ); //递归遍历左子树
preOrder (t->rchild ); //递归遍历右子树
}
}
(2)中序遍历:1.中序遍历左子树 2.访问根结点 3.中序遍历右子树
如图的中序遍历为:DGBAECF
void inOrder(BitTree t) //中序遍历
{
if(t) //树不为空
{
inOrder (t->lchild );
visit(t->data ); //访问节点数据
inOrder (t->rchild );
}
}
如图的后序遍历为:GDBEFCA
void postOrder(BitTree t) //后序遍历
{
if(t) //树不为空
{
postOrder (t->lchild );
postOrder (t->rchild );
visit(t->data ); //访问节点数据
}
}