資料結構之樹之線索化二叉樹
#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; }