中序手がかりチェーンテーブルストレージ構造を採用し、中序遍歴を実現する
2384 ワード
中序手がかりチェーンテーブルストレージ構造を採用し、中序遍歴を実現する
(1)スレッドチェーンテーブルの記憶構造を定義する.
(2)先順に二叉チェーンテーブルツリーを作成する.
(3)二叉チェーンテーブルの中序手がかり化を実現する.
(4)中順手がかりチェーンテーブルの中順遍歴を実現する.
(1)スレッドチェーンテーブルの記憶構造を定義する.
(2)先順に二叉チェーンテーブルツリーを作成する.
(3)二叉チェーンテーブルの中序手がかり化を実現する.
(4)中順手がかりチェーンテーブルの中順遍歴を実現する.
#include
#include
#include
using namespace std;
typedef char TElemType;
/*2. ,
(2) ;
(3) ;
(4) 。
*/
typedef enum PointerTag { Link, Thread };//Link==0: Thread==1:
typedef struct BiThrNode {
TElemType data;
struct BiThrNode *lchild, *rchild;//
PointerTag LTag, RTag;//
}BiThrNode, *BiTrTree;
BiTrTree pre = (BiThrNode*)malloc(sizeof(BiThrNode));
//
void CreateBiTree(BiTrTree &T) {
char ch;
scanf("%c", &ch);
if (ch == '#') T = NULL;
else {
if (T = (BiThrNode *)malloc(sizeof(BiThrNode))) {
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
}
//(3) ;
void InThreading(BiTrTree 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 P->RTag = Link;
pre = P;
InThreading(P->rchild);
}
}
// ,
void InOrderThread_Head(BiTrTree &head, BiTrTree &P) {
head = (BiThrNode*)malloc(sizeof(BiThrNode));
head->rchild = head;//
head->LTag = Link;
head->RTag = Thread;//
if (!P) {
head->lchild = head;//
}
else {
head->lchild = P;
pre = head;
InThreading(P);//
pre->RTag = Thread;
pre->rchild = head;
head->rchild = pre;
}
}
//(4) 。
void InOrderTraverse_Thr(BiTrTree T) {
BiTrTree p = new BiThrNode;
p = T->lchild;
while (p != T) {
while (p->LTag == Link) {
p = p->lchild;
}
printf("%c", p->data);
while (p->RTag == Thread && p->rchild != T) {
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild;
}
}
int main()
{
pre->RTag = Thread;
pre->rchild = NULL;
BiTrTree P, s;
P = (BiThrNode *)malloc(sizeof(BiThrNode));
printf(" :");
CreateBiTree(P);
InOrderThread_Head(s, P);
printf(" :");
InOrderTraverse_Thr(s);
printf("
");
system("pause");
return 0;
}