#include<stdio.h>
#include<stdlib.h>
//定义结构体
typedef struct node{
char data;
struct node *left, *right;
int Lflag;
int Rflag; //左右标志是左右子树还是前驱后继节点,Link = 0: 左右子树,, Thread =1;前驱后继节点
}Node,*TreeNode;
TreeNode pre = NULL;
//利用前序创建树,若使用中序或者后序,只需调正一下语句位置
void createTree(TreeNode *T){
char data;
scanf("%c",&data);
if(T!=NULL){
if(data != '#'){
//分配内存
if(!((*T) = (Node *)malloc(sizeof(Node)))){
printf("申请内存失败!");
return;
}//赋值
else{
(*T) ->data = data;
createTree(&((*T)->left)); //初始化左子树
createTree(&((*T)->right));
}
}else{
(*T) = NULL;
}
}
}
//中序遍历
void mid_SearchTest(TreeNode T){
if(T){
mid_SearchTest(T->left);
printf("%c ", T->data);
mid_SearchTest(T->right);
}
}
//中序对二叉树进行线索化
void mid_InThreading(TreeNode T){
if(T){
mid_InThreading(T ->left); //递归左子树线索化
//如果当前节点没有左孩子,则左标志设为1,指向上一个节点pre
if(!(T->left)){
T ->Lflag = 1;
T ->left = pre;
}
//如果pre没有右节点,则右标志为1,指向下一个节点
if(pre != NULL && pre ->right ==NULL){
pre ->Rflag = 1;
pre ->right = T;
}
pre = T; //pre指向当前节点
mid_InThreading(T ->right); //递归右子树
}
}
//中序遍历线索二叉树
void mid_Search(TreeNode T){
while(T){
//一直找左子树,最后一个左节点输出
while(T ->Lflag != 1){
T = T ->left;
}
printf("%c ",T->data);
//当节点右标志为1时,直接找到其后继节点
while(T->Rflag == 1 && T ->right != NULL){
T = T->right;
printf("%c ",(T ->data));
}
//否则,找到其右子树的最下边的左节点遍历
T =T->right;
}
}
int main(){
TreeNode T;
printf("请输入mid遍历的序列:\n");
createTree(&T);
printf("\n");
mid_InThreading(T);
printf("请输入mid遍历的序列:\n");
mid_Search(T);
return 0;
}
转载于:https://my.oschina.net/1024and1314/blog/3085341