树是N(N>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树种:1.有且仅有一个特定的称为根(root)的结点;2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2……Tm,其中每一个集合本身又是一棵树,并且称为根的字数(SubTree).
结点拥有的子树数称为结点的度。度为0的结点称为叶结点或终端节点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值
结点的子树的根称为该结点的孩子,该结点称为孩子的双亲。同一个双亲的孩子之间互称兄弟。结点的祖先是从根到该结点所经分支上的所有结点
结点的层次从根开始定义,根为第一层,根的孩子为第二层,以此类推。树种结点的最大层次称为树的深度或高度
森林是m棵互不相交的树的集合
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组合
结点的结构体定义
Typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchlid;
}BiTNode,*BiTree;
二叉树的建立
将二叉树的空指针引出一个虚结点,其值为一特定值,比如“#”
void CreateBiTree(BiTree *t)
{
char ch;
scanf("%c",ch);
if(ch =='#')
*t = NULL;
else{
*t = (BiTree)malloc(sizeof(BiTree));
if(!*t)
exit(overflow);
(*t)->data = ch;
CreateBiTree(&(*t)->lchild);
CreateBiTree(&(*t)->rchild);
}
}
二叉树的前序遍历
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
二叉树的中序遍历
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
二叉树的后序遍历
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
线索二叉树
我们把指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树
线索二叉树的结构体的实现
typedef enum{
link,
Thread
}PointerTag;
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag;
PointerTag RTag;
}BiThrNode,*BiThrTree;
中序遍历线索化的递归函数
BiThrTree pre; //全局变量,始终指向刚刚访问过的结点
void InThreading(BiThrTree p)
{
if(p){
InThreading(p->lchild);//递归左子树线索化
if(!p->child){//没有左孩子
p->LTag=Thread;//前驱线索
p->lchild=pre;//左孩子指针指向前驱
}
if(!pre->rchild){//前驱没有右孩子
pre->RTag=Thread;//后继线索
pre->rchild=p;//前驱右孩子指针指向后继
}
pre=p;//保持pre指向p的前驱
InThreading(p->rchild);//递归右子树线索化
}
}
遍历线索二叉树
BOOL InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p = T->lchild;//p指向根结点
while(p != T){//空树或遍历结束时,p==T
while(p->LTag==Link)//当LTag==0时循环到中序序列第一个节点
p = p->lchild;
printf("%c",p->data);//显示结点数据,可以更改为其他对结点操作
while(p->RTag==Thread && p->child != T){
p = p->rchild;
printf("%c",p->data);
}
p = p->rchild;//p进至其右子树根
}
return OK;
}