typedef int TElemType;
typedef struct PTNode{
TElemeType data; //结点数据
int parent; //双亲位置
}PTNode;
typedef struct{
PTNode nodes[MAXSIZE];
int r; //根结点
int n; //结点数
}
1.data child1 child2
指针域的个数等于树的度
2.data degree(度域) child1 child2
每个结点指针域的个数等于该结点的度,一个位置存储结点指针域的个数
//孩子结点
typedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
//表头
typedef struct {
TElemType data;
ChildPtr firstchild;
}CTBox;
//树结构
typedef struct{
CTBox nodes[MAXSIZE];
int r; //根结点
int n; //结点数;
}
typedef struct CSNode{
TElemType data;
struct CSNode *firstchild, *rightsib;
} CSNode,*CSTree;
typedef struct BiTNode{
TElemeType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
A
B C
D E F
G H I
前序:ABDGHCEIF
中序:GDHBAEICF
后序:GHDBIEFCA
层序:ABCDEFGHI
//前序 根左右
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);
}
5.已知前序和中序(后序和中序)可以确定唯一二叉树
void CreateBiTree(BiTree *T){
TElemType ch;
scanf("%c",&ch);
if(ch == "#"){
*T = NULL;
}else{
*T = (BiTree)malloc(sizeof(BiTNOde));
if(!*T){
exit(OVERFLOW);
}else{
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
}
//二叉树的二叉线索树存储结构定义
typedef enum {
Link,Thread
}PointerTag;//Link=0 表示指向左右孩子指针,Thread = 1 表示指向前驱或后驱
typedef struct BiThrNode{
TElemType data;
struct BiThreNode *lchild,*rchild;
PointerTag LTag;
PointerTag RTag;
}BiTheNode,*BiTheTree;
BiThrThree pre;
void InTheading(BiThrThree p){
if(p){
InThreadDing(p->lchild);//递归左子树线索化
if(!p->lchild){ //没有左孩子
p->LTag = Thread; //前驱线索
p->lchild = pre; //指向前驱
}
if(!pre->rchild){ //前驱没有右孩子
pre->RTag = Thread;
pre->rchild = p; //前驱右孩子指针指向后驱(当前节点 p)
}
pre = p; // 保持 pre 指向 p 的前驱
InThreading(p->rchild); //递归右子树线索化
}
}
//遍历
Status 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->rchild !=T){
p = p->rchild;
printf("%c",p->data);
}
p = p->rchild; //p进至其右子树根
}
return OK;
}