线索二叉树构造和遍历
(实验)线索二叉树构造和遍历
任选一种(先序、中序、后序)线索二叉树,实现如下功能:
①创建二叉树:按照先序序列依次输入各个结点以及空子树,创建二叉树;
②线索化二叉树:对创建的二叉树进行先序遍历;
③遍历线索二叉树:对线索二叉树进行相应的遍历。
#include<stdio.h> #include<stdlib.h> #define OVERFLOW -1 typedef struct BiTNode { int data; struct BiTNode* lchild; struct BiTNode* rchild; int ltag, rtag;//左右线索标志 }BiTNode,* BiTree; BiTNode* pre = NULL;//全局变量,指向当前访问结点的前驱 void CreateBiTree(BiTree* T)//二叉树的输入规则 { int num;//定义一个变量用于储存输入的字符 scanf("%d", &num); if (num == 0)(*T) = NULL; else { (*T) = (BiTree)malloc(sizeof(BiTNode));//申请新空间 if (!(*T)) { printf(" 内存分配失败 "); exit(OVERFLOW); } (*T)->data = num; (*T)->ltag = 0; (*T)->rtag = 0; CreateBiTree(&(*T)->lchild);//建立左子树 CreateBiTree(&(*T)->rchild);//建立右子树 } } void BuildBiTree_Thr(BiTree T) //创建线索二叉树并对右子树标记 { if (T != NULL) { ThreadBiTree(T); if (pre->rchild == NULL) pre->rtag = 1;//右子树标记 } printf(" 线索二叉树建立完成! "); } void visit(BiTree T)//遍历输出树的结点 { printf("%d ", T->data);//输出结点 } void BuildThread(BiTree T)//线索化 { if (T->lchild == NULL) {//左子树为空,建立前驱结点 T->lchild = pre; T->ltag = 1; } if (pre != NULL && pre->rchild == NULL) 右子树为空,建立后继结点 { pre->rchild = T; pre->rtag = 1; } pre = T; } void ThreadBiTree(BiTree T)//中序递归 { if (T != NULL) { ThreadBiTree(T->lchild); BuildThread(T); ThreadBiTree(T->rchild); } } BiTNode* FirstNode(BiTNode* p) {//寻找最先被访问的结点 while (p->ltag == 0)p = p->lchild; return p; } BiTNode* NextNode(BiTNode* p) {//寻找后继结点 if (p->rtag == 0)return FirstNode(p->rchild); else return p->rchild; } BiTNode* LastNode(BiTNode* p) {//寻找最后被访问的结点 while (p->rtag == 0)p = p->rchild; return p; } BiTNode* PreNode(BiTNode* p){//寻找前驱结点 if (p->ltag == 0)return LastNode(p->lchild); else return p->lchild; } void InOrder_Thread(BiTree T) {//中序遍历线索二叉树 for (BiTNode* p = FirstNode(T);p != NULL;p = NextNode(p)) visit(p); } void main() { BiTree T; printf(" 输入先序序列构建二叉树(空结点用“0”表示):"); CreateBiTree(&T); BuildBiTree_Thr(T); printf(" 中序遍历线索二叉树序列为:"); InOrder_Thread(T); }