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

#include
#include

//定义结构体
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;

}

递归实现线索二叉树的线索化和三种遍历(C语言)_第1张图片

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

你可能感兴趣的:(递归实现线索二叉树的线索化和三种遍历(C语言))