树结构是一种常用的非线性数据结构。
树的形式化定义:树是由n(n>=0)个结点组成的有穷集合,在任意的一个非空树中,有且仅有一个称为根(Root)的结点,当n>1时,其余的结点分为m(m>0)个互不相交的有限集,T1,T2,……Tm,其中,每一个集合本身又是一棵树,并称为根的子树(SubTree)。
树结构在计算机中的存储形式很多,最简单的一种就是多重链表,可描述如下:
#define MaxChild 10
typedef struct node
{
dataType data;
struct node *child[MaxChild];
}
这种表示方法最大的有点是节省内存资源,缺点是操作起来相对复杂。
二叉树(Binary Tree)是一种特殊的树结构,其定义如下:它或者为空,或者由一个根节点加上两颗分别称为左子树和右子树的互不相交的二叉树组成。
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
二叉树的遍历
1、先序遍历(访问根结点,先序遍历左子树,先序遍历右子树)
PreOrderTraverse(BiTree T)
{
if (T) /* 递归结束条件,T为空 */
{
visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
2、中序遍历(中序遍历左子树,访问根结点,中序遍历右子树)
InOrderTraverse(BiTree T)
{
if (T) /* 递归结束条件,T为空 */
{
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
}
3、后序遍历(后序遍历左子树,后序遍历右子树,访问根结点)
PosOrderTraverse(BiTree T)
{
if (T) /* 递归结束条件,T为空 */
{
PosOrderTraverse(T->lchild);
PosOrderTraverse(T->rchild);
visit(T->data);
}
}
二叉树的创建
/* 先序创建一颗二叉树 */
CreateBiTree(BiTree *T)
{
char c;
scanf("%c", &c);
if (c == ' ') *T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}