实验目的: ⑴ 熟悉线索二叉树的定义和基本操作 ⑵ 掌握线索二叉树的链式存储结构设计与基本操作的实现 实验内容: 1、采用书上第 133 页定义的线索二叉树的线索链表存储表示,编程实现线索二叉树的下列基本操作。 (1)建立先序线索二叉树 (2)建立中序线索二叉树 (3)建立后序线索二叉树 (4)先序遍历线索二叉树 (5)中序遍历线索二叉树 (6)后序遍历线索二叉树 程序清单: #include<iostream> using namespace std; #include<malloc.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef enum { Link, Thread }PointerTag; typedef struct BiThrTNode { TElemType data; BiThrTNode* lchild, * rchild, * Pparent; PointerTag LTag, RTag; }BiThrTNode, * BiThrTree; BiThrTree pre1 = NULL; BiThrTree pre2 = NULL; BiThrTree pre3 = NULL; Status CreateBiThrTree(BiThrTree& T) { char ch; cin >> ch; if (ch == '#') { T = NULL; } else { T = (BiThrTNode*)malloc(sizeof(BiThrTNode)); if (!T) exit(OVERFLOW); T->LTag = Link; T->RTag = Link; T->data = ch; CreateBiThrTree(T->lchild); CreateBiThrTree(T->rchild); } return OK; } //先序线索化 void PreThreading(BiThrTree& p) { if (p) { if (p->lchild == NULL) { p->lchild = pre1; p->LTag = Thread; } if (pre1 != NULL && pre1->rchild == NULL) { pre1->rchild = p; pre1->RTag = Thread; } pre1 = p; if (p->LTag != Thread) PreThreading(p->lchild); if (p->RTag != Thread) PreThreading(p->rchild); } } Status PreOrderThreading(BiThrTree& T) { if (T) { PreThreading(T); pre1->rchild = NULL; pre1->RTag = Thread; } return OK; } Status PreOrderTraverse_Thr(BiThrTree T) { if (T) { cout << T->data; if (T->LTag != Thread) PreOrderTraverse_Thr(T->lchild); if (T->RTag != Thread) PreOrderTraverse_Thr(T->rchild); } return OK; } void InThreading(BiThrTree p) { if (p) { InThreading(p->lchild); if (!p->lchild) { p->LTag = Thread; p->lchild = pre2; } if (pre2 && !pre2->rchild) { pre2->RTag = Thread; pre2->rchild = p; } pre2 = p; InThreading(p->rchild); } } //二叉树线索化 Status InOrderThreading(BiThrTree& Thrt, BiThrTree T) { if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrTNode)))) exit(OVERFLOW); Thrt->rchild = Thrt; Thrt->RTag = Link; if (!T) { Thrt->lchild = Thrt; Thrt->LTag = Link; } else { pre2 = Thrt; Thrt->lchild = T; Thrt->LTag = Link; InThreading(T); pre2->rchild = Thrt; pre2->RTag = Thread; Thrt->rchild = pre2; } return OK; } Status InOrderTraverse_Thr(BiThrTree T) { BiThrTree p; p = T->lchild; while (p != T) { while (p->LTag == Link) { p = p->lchild; } cout << p->data; while (p->RTag == Thread && p->rchild != T) { p = p->rchild; cout << p->data; } p = p->rchild; } return OK; } Status CreateBiThrTree1(BiThrTree& T, BiThrTree parent) { char ch; cin >> ch; if (ch == '#') { T = NULL; } else { T = (BiThrTNode*)malloc(sizeof(BiThrTNode)); if (!T) exit(OVERFLOW); T->LTag = Link; T->RTag = Link; T->Pparent = parent; T->data = ch; CreateBiThrTree1(T->lchild, T); CreateBiThrTree1(T->rchild, T); } return OK; } //后序线索化 void PostThreading(BiThrTree p) { if (p) { PostThreading(p->lchild); PostThreading(p->rchild); if (!p->lchild) { p->lchild = pre3; p->LTag = Thread; } if (pre3 && !pre3->rchild) { pre3->rchild = p; pre3->RTag = Thread; } pre3 = p; } } Status PostOrderThreading(BiThrTree& Thrt, BiThrTree T) { if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrTNode)))) exit(OVERFLOW); Thrt->rchild = Thrt; Thrt->RTag = Link; if (!T) { Thrt->lchild = Thrt; Thrt->LTag = Link; } else { pre3 = Thrt; Thrt->lchild = T; Thrt->LTag = Link; PostThreading(T); } return OK; } Status PostOrderTraverse_Thr(BiThrTree T) { BiThrTree p; p = T->lchild; BiThrTree q = NULL; while (p != NULL) { while (p->lchild != q && p->LTag == Link) { p = p->lchild; } while (p && p->RTag == Thread) { cout << p->data; q = p; p = p->rchild; } if (p == T->lchild) { cout << p->data; return OK; } while (p && p->rchild == q) { cout << p->data; q = p; p = p->Pparent; } if (p && p->RTag == Link) { p = p->rchild; } } return OK; } int main() { BiThrTree T; cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl; CreateBiThrTree(T); if (PreOrderThreading(T) == OK) cout << "成功建立先序线索化链表!" << endl; cout << "先序遍历线索二叉树,结果是:" << endl; PreOrderTraverse_Thr(T); cout << endl; BiThrTree T1, Thrt1; cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl; CreateBiThrTree(T1); if (InOrderThreading(Thrt1, T1) == OK) cout << "成功建立中序线索化链表!" << endl; cout << "中序遍历线索二叉树,结果是:" << endl; InOrderTraverse_Thr(Thrt1); cout << endl; BiThrTree T2, Thrt2; BiThrTree parent = NULL; cout << "创建线索二叉树,按先序次序输入线索二叉树中的结点的值:" << endl; CreateBiThrTree1(T2, parent); if (PostOrderThreading(Thrt2, T2) == OK) cout << "成功建立后序线索化链表!" << endl; cout << "后序遍历线索二叉树,结果是:" << endl; PostOrderTraverse_Thr(Thrt2); cout << endl; return 0; } 运行情况: 实验体会: 通过先序、中序、后序二叉树的线索化,更加理解了二叉树的遍历过程和算法,熟悉了线索二叉树。
|
09线索二叉树的创建和遍历
最新推荐文章于 2024-01-01 17:34:00 发布