树
ADT 树
Operation:
InitTree(*T);
DestroyTree(*T);
CreateTree(*T,definition);
ClearTree(*T);
TreeEmpty(T);
TreeDepth(T);
Root(T);
Value(T,cur_e);
Assign(T,cur_e,value);
Parent(T,cur_e);
LeftChild(T,cur_e);
RightSibling(T,cur_e);
InsertChild(*T,*p,i,c);
DeleteChild(*T,*p,i);
双亲表示法
根节点没有双亲,约定根节点的位置域设置为-1
#define Max_Tree_Size 100
typedef int TElemType;
typedef struct PTNode{
TElemType data;
int parent;
}PTNode;
typedef struct PTree{
PTNode nodes[Max_Tree_Size];
int r,n; //根的位置和节点数
};
//根节点没有双亲,约定根节点的位置域设置为-1
孩子表示法
#define Max_Tree_Size 100
typedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
typedef struct CTBox{
TElemType data;
ChildPtr firstchild;
}CTBox;
typedef struct CTree{
CTBox node[Max_Tree_Size];
int r,n;//根的位置和节点数
}CTree;
双亲孩子表示法
#define Max_Tree_Size 100
typedef struct PCTNode{
int child;
struct PCTNode *next;
}*ChildPtr;
typedef struct PCTBox{
TElemType data;
int parent;
ChildPtr firstchild;
};
typedef struct PCTree{
PCTBox nodes[Max_Tree_Size];
int n,r;
}PCTree;
孩子兄弟表示法
想找双亲,完全可以增加一个parent指针域
/*孩子兄弟表示法*/
typedef struct CSNode{
TElemType data;
struct CSNode *firstchild, *rightsib;
}CSNode, *CSTree;
//想找双亲,完全可以增加一个parent指针域
/* struct CSNode *parent;*/
特殊的二叉树:斜树、满树、完全二叉树
二叉树的存储结构
1.顺序存储结构
2.二叉链表
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
遍历二叉树
1.前序遍历
void PreOrderTraverse(BiTree T){
if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
2.中序遍历
void InOrderTraverse(BiTree T){
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
3.后序遍历
void PostOrderTraverse(BiTree T){
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
二叉树的建立
前序遍历
void CreateBiTree(BiTree *T){
TElemType ch;
scanf("%c", &ch);
if(ch=='#')
*T=NULL;
else{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(OVERFLOW);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
中序遍历
后序遍历
搜索二叉树
把指向前驱和后继的指针称为线索,加上线索的二叉链表成为搜索链表,相应的二叉树成为搜索二叉树
/*二叉树的二叉搜索存储结构定义*/
typedef enum {Link, Thread} PointerTag;
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag;
PointerTag RTag;
}BiThrNode *BiThrTree;
/*中序遍历搜索化的递归函数代码*/
BiThrTree pre;
void InThreading(BiThrTree p){
if(p){
InThreading(p->lchild);
if(!p->lchild){
p->LTag = Thread;
p->lchild = pre;
}
if(!pre->rchild){
pre->RTag=Thread;
pre->lchild=p;
}
pre=p;
InTreading(p->rchild);
}
}
/*遍历代码如下*/
/*T指向头结点,头结点左链lchild指向根节点,头结点右链rchild指向中序遍历的最后一个节点*/
Status InOrderTraverse_Thr(BiThrTree T){
BiThrTree p;
p = T->lchild;
while(p!=T)
{
while(p->LTag==Link)
p=p->lchild;
printf("%c", p->data);
while(p->RTag==Thread && p->rchild!=T){
p=p->rchild;
printf("%c", p->data);
}
p=p->rchild;
}
return OK;
}
树、森林、二叉树之间的转换
树和森林的遍历
树的遍历:先根遍历、后根遍历
森林的遍历:前序遍历、后续遍历