中序手がかりチェーンテーブルストレージ構造を採用し、中序遍歴を実現する


中序手がかりチェーンテーブルストレージ構造を採用し、中序遍歴を実現する
(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; }