建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法。
#include<stdlib.h> #include<stdio.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int Status; typedef char ElemType; typedef enum PointerTag {Link, Thread};//Link=0:指针;Thread=1:线索 //带线索的二叉树链表结构 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; //左右指针 PointerTag LTag, RTag; //左右标志 }BiTNode,*BiTree; //打印元素 Status PrintElement(BiTree T); //1-创建二叉树 //按先序次序输入二叉树中结点的值(一个字符),空格表示空树 Status CreateBiTree(BiTree &T); //2中序遍历二叉树,并将其中序线索化 Status InOrderThreading_Head(BiTree &Thrt, BiTree T); //3线索化二叉树 void InThreading(BiTree p,BiTree &pre); //4中序遍历二叉线索树(非递归) Status InOrderTraverse_Thr(BiTree T); //打印元素 Status PrintElement(ElemType e) { printf("%c",e); return OK; } //1-创建二叉树 // 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树, Status CreateBiTree(BiTree &T) { ElemType ch; ch=getchar(); if (ch==' ') T = NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data = ch; // 生成根结点 T->LTag = Link; T->RTag = Link; CreateBiTree(T->lchild); // 构造左子树 CreateBiTree(T->rchild); // 构造右子树 } return OK; } // CreateBiTree //2中序遍历二叉树,并将其中序线索化 Status InOrderThreading_Head(BiTree &Thrt, BiTree T) { BiTree pre; if (!(Thrt = (BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); Thrt->LTag = Link; Thrt->RTag =Thread; // 建头结点 Thrt->rchild = Thrt; // 右指针回指 if (!T) Thrt->lchild = Thrt; // 若二叉树空,则左指针回指 else { Thrt->lchild = T; pre = Thrt; InThreading(T,pre); // 算法6.7 pre->rchild = Thrt; pre->RTag = Thread; // 最后一个结点线索化 Thrt->rchild = pre; } return OK; } // InOrderThreading //3线索化二叉树 //线索二叉树 void InThreading(BiTree p, BiTree &pre) { if(p){ InThreading(p->lchild, pre); if(!p->lchild){p->LTag = Thread;p->lchild = pre;} if(!pre->rchild){pre->RTag = Thread;pre->rchild = p;} pre = p; InThreading(p->rchild, pre); } } //4中序遍历二叉线索树(非递归) Status InOrderTraverse_Thr(BiTree T) { BiTree p = T->lchild; while(p != T) { while(p->LTag == Link) p = p->lchild; PrintElement(p->data); while(p->RTag == Thread && p->rchild!= T){ p = p->rchild; PrintElement(p->data); } p = p->rchild; } return OK; } void main() { BiTree T,Thrt; printf("按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树:\n"); CreateBiTree(T); InOrderThreading_Head(Thrt,T); printf("\n中序线索遍历二叉树:"); InOrderTraverse_Thr(Thrt); printf("\n"); }