#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
//构造树
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rlchild;
}BiTnode, *BiTree;
//中序遍历
void Visit(BiTree T) {
char c = T->data;
printf("%c\n", c);
}
void InOrder(BiTree T) {
if (T) {
InOrder(T->lchild);
Visit(T);
InOrder(T->rlchild);
}
}
void InitBiTree() {
BiTree root = (BiTree)malloc(sizeof(BiTNode));
root->data = 'A';
root->lchild = NULL;
root->rlchild = NULL;
//插入节点
BiTNode* p = (BiTNode*)malloc(sizeof(BiTNode));
root->lchild = p;
p->data = 'B';
p->lchild = NULL;
p->rlchild = NULL;
BiTNode* p1 = (BiTNode*)malloc(sizeof(BiTNode));
root->rlchild = p1;
p1->data = 'C';
p1->lchild = NULL;
p1->rlchild = NULL;
BiTNode* p2 = (BiTNode*)malloc(sizeof(BiTNode));
p->lchild = p2;
p2->data = 'D';
p2->lchild = NULL;
p2->rlchild = NULL;
BiTNode* p3 = (BiTNode*)malloc(sizeof(BiTNode));
p->rlchild = p3;
p3->data = 'E';
p3->lchild = NULL;
p3->rlchild = NULL;
BiTNode* p4 = (BiTNode*)malloc(sizeof(BiTNode));
p1->lchild = p4;
p4->data = 'F';
p4->lchild = NULL;
p4->rlchild = NULL;
BiTNode* p5 = (BiTNode*)malloc(sizeof(BiTNode));
p2->rlchild = p5;
p5->data = 'G';
p5->lchild = NULL;
p5->rlchild = NULL;
InOrder(root);
}
//中序线索化二叉树
typedef struct ThreadNode {
char data;
struct ThreadNode* lchild, * rchild;
int ltag, rtag;//初始化时应该把这两个值设置为0,表示为节点
}ThreadNode, *ThreadTree;
void TVisit(ThreadTree T);
void InThread(ThreadTree T) {
if (T) {
InThread(T->lchild);
TVisit(T);
InThread(T->rchild);
}
}
//全局辅助变量
ThreadNode* pre = NULL;
//所谓线索化,就是把空着的左链域填入前驱节点 右链域填入后继节点
//访问到一个节点时,先看他的左子树是否是空的,如果是,则填入前驱
//如果右子树是空的,不能一下子看到后继是谁,所以需要在访问后一个节点时,将pre的后继改成之后的之后的这个节点
//最后要把pre向后移动一个节点
void TVist(ThreadTree T){
if (T->lchild == NULL) {
T->lchild = pre;
T->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = T;
pre->rtag = 1;
}
pre = T;
}//线索化核心函数
void InitThreadTree(BiTree T) {
if (T) {
InOrder(T);
if (pre->rchild == NULL) {
pre->rtag = 1;
}//处理最后一个节点
}
}
int main() {
//InitBiTree();
return 0;
}
5.2.3中序线索化二叉树
最新推荐文章于 2024-04-29 19:53:30 发布