递归实现线索二叉树的线索化和三种遍历(C语言)

本文介绍了一种基于二叉树的线索化技术,通过修改二叉树的空指针来存储前驱和后继节点,从而实现中序遍历而无需使用递归或栈。文章详细展示了如何创建二叉树,进行线索化处理,并提供了中序遍历的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

761ca98810b784c00d20a303ddf3c03206a.jpg

转载于:https://my.oschina.net/1024and1314/blog/3085341

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值