/**
*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);
}
线索二叉树的建立及遍历(中序)
最新推荐文章于 2024-12-17 21:19:02 发布
本文详细介绍了如何使用C语言实现线索二叉树的建立及其遍历过程,重点讲解了中序遍历下线索二叉树的构建方法,并提供了完整的代码实现,包括获取第一个节点、最后一个节点、前驱节点和后继节点的函数。
7619

被折叠的 条评论
为什么被折叠?



