线索二叉树的建立及遍历(中序)

/**
*2018.09.16  12:30
*线索二叉树的建立及遍历(中序)
*/
#include<stdio.h>
#define MAX 100


typedef struct BTNode {
	int e;
	struct BTNode *rchild, *lchild;
	int ltag, rtag;
}BTNode;

void inThread(BTNode *, BTNode **);
void createInThread(BTNode *);
BTNode * getFirst(BTNode *);
BTNode * getLast(BTNode *);
BTNode * getPrecursor(BTNode *);
BTNode * getSucceeding(BTNode *);
void traverseInThread(BTNode *);


int main(void) {
	system("COLOR fc");



	putchar('\n');
	system("pause");
	return 0;
}


void inThread(BTNode *p, BTNode **pre) {
	if (NULL != p) {
		inThread(p->lchild, pre);

		if (NULL == p->lchild) {
			p->lchild = *pre;
			p->ltag = 1;
		}
		if (NULL != *pre && NULL == (*pre)->rchild) {
			(*pre)->rchild = p;
			(*pre)->rtag = 1;

		}
		*pre = p;
	
		inThread(p->lchild, pre);
	}
}


void createInThread(BTNode *p) {
	if ( NULL != p) {
		BTNode *pre = NULL;
		inThread(p, &pre);
	
		pre->rtag = 1;
		pre->rchild = NULL;
	}
}


BTNode* getFirst(BTNode *p) {
	if (NULL != p) {
		while (0 == p->ltag) 
			p = p->lchild;
		return p->lchild;
	}
	else return NULL;
}


BTNode* getLast(BTNode *p) {
	if (NULL != p) {
		while (0 == p->rtag) 
			p = p->rchild;
		return p->rchild;
	}
	else return NULL;
}


BTNode* getPrecursor(BTNode *p) {
	if (NULL != p) {
		if (1 == p->ltag)
			return p->lchild;
		else return getLast(p->lchild);
	}
	else return NULL;
}


BTNode* getSucceeding(BTNode *p) {
	if (NULL != p) {
		if (1 == p->rtag)
			return p->rchild;
		else return getFirst(p->rchild);
	}
	else return NULL;
}


void traverseInThread(BTNode *p){
	for (p = getFirst(p); p = getSucceeding(p); NULL != p)
		printf("%5d ", p->e);	
}
发布了48 篇原创文章 · 获赞 3 · 访问量 5138

猜你喜欢

转载自blog.csdn.net/ydeway/article/details/101039726