1. 程式人生 > >線索二叉樹的基本操作

線索二叉樹的基本操作

(1)二叉樹的線索化

(2)對線索二叉樹進行中序遍歷

#include<iostream>
using namespace std;

typedef char TElemType;
enum Status {OK = 1,ERROR = 0};
enum PointerTag{Link = 0,Thread = 1};

//typedef struct BiTNode {
//  TElemType data;
//  struct BiTNode *lchild, *rchild;
//}BiTNode,*BiTree;


typedef struct BiThrNode {
    TElemType data
; struct BiThrNode *lchild, *rchild; PointerTag LTag, RTag; }BiThrNode, *BiThrTree; Status CreateBiTree(BiThrTree &T) { char ch; scanf("%c", &ch); if (ch == ' ')T = NULL; else { if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))exit(OVERFLOW); T->RTag =
T->LTag = Link; T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } BiThrTree pre; void InThreading(BiThrTree p) { if (p) { InThreading(p->lchild); if (!p->lchild) { p->LTag = Thread; p->
lchild = pre; } if (!pre->rchild) { pre->RTag = Thread; pre->rchild = p; } pre = p; InThreading(p->rchild); } } Status InOrderThreading(BiThrTree&Thrt, BiThrTree T) { if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode))))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->rchild = Thrt; pre->RTag = Thread; Thrt->rchild = pre; } return OK; } Status InOrderTraverse_Thr(BiThrTree T) { BiThrTree p; p = T->lchild; while (p != T) { while (p->LTag == Link)p = p->lchild; if (printf("%c ", p->data) <= 0)return ERROR; while (p->RTag == Thread&&p->rchild != T) { p = p->rchild; printf("%c ", p->data); } p = p->rchild; } return OK; } int main() { BiThrTree T1; BiThrTree T2; CreateBiTree(T1); InOrderThreading(T2,T1); InOrderTraverse_Thr(T2); return 0; }

這裡寫圖片描述