3.1 二叉树的存储结构
//顺序存储#define MaxSize 100struct TreeNode { ElemType value; bool isEmpty;};TreeNode t[MaxSize];//链式存储typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
3.2 二叉树的前中后序遍历
//前序遍历void PreOrder(BiTree T){ if(T!=NULL) visit(T); PreOrder(T->lchild); PreOrder(T->rchild);}//中序遍历void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T); InOrder(T->rchild); }}//后序遍历void PostOrder(BiTree T){ if(T!=NULL){ PostOrder(T->lchild); PostOrder(T->rchild); visit(T); }}
3.3 二叉树的层序遍历
void LevelOrder(BiTree T){ LinkQueue Q; InitQueue(Q); BiTree p; EnQueue(Q,T); while(!IsEmpty(Q)){ DeQueue(Q,p); visit(p); if(p->lchild!=NULL) EnQueue(Q,p->lchild); if(p->rchild!=NULL) EnQueue(Q,p->rchild); }}
3.4 二叉树的中序线索化
//线索二叉树结点typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;}ThreadNode,*ThreadTree;//全局变量pre,指向当前访问结点的前驱ThreadNode *pre=NULL;//中序遍历二叉树,一边遍历一边线索化void InThread(ThreadTree T){ if(T!=NULL){ InThread(T->lchild); visit(T); InThread(T->rchild); }}void visit(ThreadNode *q){ if(q->lchild==NULL){ q->lchild=pre; q->ltag=1; } if(pre!=NULL && pre->rchild==NULL){ pre->rchild=q; pre->rtag=1; } pre=q;}//中序线索化二叉树Tvoid CreateInThread(ThreadTree T){ pre=NULL; if(T!=NULL){ if(pre->rchild==NULL) pre->rtag=1; }}
3.5 二叉树的先序线索化
//全局变量pre,指向当前点的前驱ThreadNode * pre=NULL;//先序遍历二叉树,一边遍历一遍线索化void Prethread(ThreadTree T){ if(T!= NULL){ visit(T); PreThread(T->lchild); PreThread(T->lchild); }}void visit(ThreadNode *q){ if(q->lchild==NULL){ q->lchild=pre; q->ltag=1; } if(pre!=NULL && pre->rchild==NULL){ pre->rchild=q; pre->rtag=1; } pre=q;}//先序线索化二叉树Tvoid createPreThread(ThreadTree T){ pre=NULL; if(T->NULL){ PreThread(T); if(pre->rchild==NULL) pre->rtag=1; }}
3.6 二叉树的后序线索化
ThreadTree *pre=NULL;//后序遍历void PostThread(ThreadTree T){ if(T!=NULL){ PostThread(T->lchild); PostThread(T->rchild); visit(T); }}void visit(ThreadNode *q){ if(q->lchild==NULL){ q->lchild=pre; q->ltag=1; } if(pre!=NULL && pre->rchild==NULL){ pre->rchild=q; pre->rchild=tag; } pre=q;}//后序线索化二叉树Tvoid CreatePostThread(ThreadTree T){ pre=NULL; if(T!=NULL){ PostThread(T); if(pre->rchild==NULL) pre->rtag=1; }}
3.7 线索二叉树找前驱/后继
//找到以P为根的子树中,第一个被中序遍历的结点ThreadNode *Firstnode(ThreadNode *p){ //循环找到最左下结点(不一定是叶节点) while(p->ltag==0) p=p->lchild; return p;}//在中序线索二叉树中找到结点p的后继结点ThreadNode *Nextnode(ThreadNode *p){ //右子树中最左结点 if(p->rtag==0) return FirstNode(p->rchild); else return p->rchild;}//对中序线索化线索二叉树进行中序遍历(利用线索二叉树实现的非递归算法)