创建中序线索二叉树并遍历

#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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值