1. 程式人生 > >資料結構之樹之線索化二叉樹

資料結構之樹之線索化二叉樹

#include<iostream> #include<malloc.h> #include<stdlib.h> using namespace std;

typedef char ElemTypeTree; const int Link = 0;//0時為指標 const int Thread = 1;//1時為線索

typedef struct Node {     int ltag, rtag;     ElemTypeTree data;     struct Node *lchild, *rchild; }*BiTree,BiTNode; BiTree pre = NULL;

typedef struct {     BiTree *basequeue;     int front;     int rear;     int queuesize; }Queue; typedef struct {     BiTree *basestack;     int top;     int bottom;     int stacksize; }Stack; void CreateTree(BiTree &T) {     BiTree root;     char ch;     ch = getchar();     if ('#' == ch)         T = NULL;     else     {         root = (BiTree)malloc(sizeof(BiTNode));         T = root;         root->data = ch;         CreateTree(root->lchild);         CreateTree(root->rchild);     } }

void InitQueue(Queue &ptr) {     ptr.queuesize = 10;     ptr.basequeue = (BiTree *)malloc(ptr.queuesize * sizeof(BiTree));     ptr.front = 0;     ptr.rear = -1; }

void EnQueue(Queue &ptr, BiTree T) {     if (ptr.rear - ptr.front == ptr.queuesize)     {         ptr.basequeue = (BiTree *)realloc(ptr.basequeue, 2 * ptr.queuesize * sizeof(BiTree));         ptr.queuesize *= 2;     }     ptr.basequeue[++ptr.rear] = T; }

void DeQueue(Queue &ptr, BiTree &T) {     if (ptr.rear == -1||ptr.front>ptr.rear)     {         cout << "error" << endl;         T = NULL;     }     else     {         T = ptr.basequeue[ptr.front];         ptr.front++;     } } int EmptyQueue(Queue Q) {     if (Q.rear == -1||Q.front>Q.rear)         return 1;     else         return 0; }

void InitStack(Stack &ptr) {     ptr.stacksize = 10;     ptr.basestack = (BiTree *)malloc(sizeof(BiTree));     ptr.top = -1;     ptr.bottom = 0; } void EnStack(Stack &ptr, BiTree T) {     if (ptr.top - ptr.bottom == ptr.stacksize)     {         ptr.basestack = (BiTree *)realloc(ptr.basestack, 2 * ptr.stacksize * sizeof(BiTree));         ptr.stacksize *= 2;     }     ptr.basestack[++ptr.top] = T; }

void DeStack(Stack &ptr, BiTree &T) {     if (ptr.top == -1)     {         cout << "error" << endl;         return;     }     else     {         T = ptr.basestack[ptr.top--];     } }

void Bianli(BiTree T) {     Queue Q;     BiTree temp = NULL;     InitQueue(Q);     if (T)     {         EnQueue(Q,T);         while (!EmptyQueue(Q))         {             DeQueue(Q, temp);             if (temp!=NULL)                 cout << temp->data << endl;             else                 return;             if(temp->lchild) EnQueue(Q, temp->lchild);             if(temp->rchild) EnQueue(Q, temp->rchild);         }     } } int EmptyStack(Stack S) {     if (S.top < S.bottom)         return 1;     else         return 0; } void Visit(BiTree t) {     if (NULL == t)     {         cout << "error" << endl;         return;     }     else         cout << t->data << endl; } void nodiguiInorederTraver(BiTree T) {     BiTree p=T;     Stack S;     InitStack(S);     while (p || !EmptyStack(S))     {         if (p)         {             EnStack(S, p);             p = p->lchild;         }         else         {             DeStack(S, p);             Visit(p);             p = p->rchild;         }     }

}

void InThreading(BiTree p) {     if (p)     {         InThreading(p->lchild);         if (!p->lchild)         {             p->ltag = Thread;             p->lchild = pre;         }         else             p->ltag = Link;         if (!pre->rchild)         {             pre->rtag = Thread;             pre->rchild = p;         }         else             pre->rtag = Link;         pre = p;         InThreading(p->rchild);     } }

void InOrderThreading(BiTree &Thrt, BiTree T) {     if (!(Thrt = (BiTree)malloc(sizeof(BiTNode))))         return;     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;

    }

}

void InOrderTraverse(BiTree T) {     BiTree p = NULL;     p = T->lchild;     while (p != T)     {         while (p->ltag == Link)             p = p->lchild;         Visit(p);         while (p->rtag == Thread && p->rchild != T)         {             p = p->rchild;             Visit(p);         }         p = p->rchild;     }

}

int main() {     BiTree head = NULL, T = NULL;     CreateTree(T);     InOrderThreading(head, T);     InOrderTraverse(head);     //cout << "bianli" << endl;     //Bianli(T);     //cout << "houxu" << endl;     //nodiguiInorederTraver(T);     //    cout << "線索化" << endl;     //InorderTreading(head,T);     //InOrderTraverseThr(head);

    //return 0;     return 0; }