#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
typedef struct BiThrNode {
ElemType data;
int ltag, rtag;
struct BiThrNode* lchild, * rchild;
}BiThrNode,*BiThrTree;
//只知道中序序列无法确定一棵二叉树,故选择先序建树
void creatInTree(BiThrTree& T) {
ElemType ch;
scanf("%c", &ch);
if (ch == '#') {
T = NULL;
}
else {
T = (BiThrNode*)malloc(sizeof(BiThrNode));
T->data = ch;
creatInTree(T->lchild);
creatInTree(T->rchild);
}
}
void inOrder(BiThrTree T) {
if (T != NULL) {
inOrder(T->lchild);
printf("%c", T->data);
inOrder(T->rchild);
}
}//初始化标记位
void initial(BiThrTree& T) {
if (T != NULL) {
T->ltag = 0;
T->rtag = 0;
initial(T->lchild);
initial(T->rchild);
}
}
//中序线索化二叉树
BiThrNode* prenod = NULL;
void InThrTree(BiThrTree pcurnode) {
if (pcurnode != NULL) {
InThrTree(pcurnode->lchild);
if (pcurnode->lchild == NULL) {
pcurnode->lchild = prenod;
pcurnode->ltag = 1;
}
if (prenod != NULL && prenod->rchild == NULL) {
prenod->rchild = pcurnode;
prenod->rtag = 1;
}
prenod = pcurnode;//注意更新前驱结点
InThrTree(pcurnode->rchild);
}
}
//注意对最后一个结点的处理,否则程序会出错
void CreateInThread(BiThrNode* T) {
prenod = NULL; //pre初始化为NULL
if (T!=NULL) { //非空二叉树才能线索化
InThrTree(T); //中序线索化二叉树
if (prenod->rchild == NULL) //实际上不用判断,中序遍历时最后一个结点的右孩子指针必为NULL
prenod->rtag = 1; //处理遍历的最后一个结点
}
}
//重根节点开始,查找树最左下结点
BiThrNode* getfirstlefttnode(BiThrTree T) {
BiThrNode* pmove = T;
while (pmove->ltag==0) {//注意线索二叉树不能判空来控制循环,应该判断标志位
pmove = pmove->lchild;
}
return pmove;
}
void inOrderThrTree(BiThrTree T) {
BiThrNode* prenode = getfirstlefttnode(T);
BiThrNode* pnextnode = NULL;
while (prenode != NULL) {
if (prenode->rtag ==1) {
printf("%c", prenode->data);
pnextnode = prenode->rchild;
prenode = pnextnode;
}
else {
printf("%c", prenode->data);
pnextnode = getfirstlefttnode(prenode->rchild);//查找右子树最左下结点
prenode = pnextnode;
}
}
}
//先序:AB#D##CE###
//中序:#B#D#A#E#C#
int main() {
BiThrTree Thr = NULL;
//创建中序二叉书
creatInTree(Thr);
//递归遍历二叉树,验证建树是否成功
//inOrder(Thr);
//初始化标记位
initial(Thr);
//中序线索化二叉树
CreateInThread(Thr);
//中序线索二叉树的遍历
inOrderThrTree(Thr);
}
创建中序线索二叉树并遍历
于 2023-04-27 02:34:04 首次发布