• (c语言)二叉树中序线索(数据结构十七)


    1.数据类型定义

    在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义:

    //定义数据结构中要用到的一些变量和类型
    #ifndef HEAD_H
    #define HEAD_H
    
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define TRUE  1
    #define FALSE 0
    #define OK    1
    #define ERROR  0
    #define INFEASIBLE -1
    #define OVERFLOW   -2    //分配内存出错
    
    typedef int  Status;     //函数返回值类型
    typedef int  ElemType;   //用户定义的数据类型
    
    #endif
    2.树的头文件 BiTree.h代码如下:

    #ifndef BITREE_H
    #define BITREE_H
    
    #include "head.h"
    
    
    //Link为指针 Thread为线索
    typedef enum PointerTag {Link,Thread};
    
    
    typedef struct BiNode{
    	ElemType data;
    	struct BiNode *left,*right;
    	int LTag,RTag;       //左右标志
    }BiNode,*pBiNode;
    
    
    Status InsertRight(pBiNode &root,ElemType e);
    Status InsertLeft(pBiNode &root,ElemType e);
    
    
    Status InitBiTree(pBiNode &tree){
    	tree=(pBiNode)malloc(sizeof(BiNode));
    	if(!tree) return OVERFLOW;
    	tree->data=-999999;
    	tree->left=NULL;
    	tree->right=NULL;
    	return OK;
    }
    Status BiTreeEmpty(pBiNode root){
    	if(root==NULL) return ERROR;
    	return root->left==root->right && root->data==-999999;
    }
    
    Status HasNoNode(pBiNode root){
    	if(root==NULL) return ERROR;
    	return root->left==root->right ;
    }
    
    Status CreatTreeNode(pBiNode &node,ElemType e){
    	node=(pBiNode)malloc(sizeof(BiNode));
    	if(!node) return OVERFLOW;
    	node->data=e;
    	node->left=NULL;
    	node->right=NULL;
    	return OK;
    }
    Status InsertRight(pBiNode &root,ElemType e){
    	if(root->right==NULL){
    		if(e>root->data){
    			pBiNode p;
    			CreatTreeNode(p,e);
    			root->right=p;
    			return OK;
    		}else{
    			pBiNode p;
    			CreatTreeNode(p,e);
    			root->left=p;
    			return OK;
    		}
    
    	}else{
    		e>root->data? InsertRight(root->right,e):InsertLeft(root,e);
    	}
    
    }
    Status InsertLeft(pBiNode &root,ElemType e){
    	if(root->left==NULL){
    		if(e>root->data){
    			pBiNode p;
    			CreatTreeNode(p,e);
    			root->right=p;
    			return OK;
    		}else{
    			pBiNode p;
    			CreatTreeNode(p,e);
    			root->left=p;
    			return OK;
    		}
    
    	}else{
    		e<=root->data?InsertLeft(root->left,e):InsertRight(root,e);
    	}
    
    }
    
    
    Status InsertTree(pBiNode &root,ElemType e){
    	if(BiTreeEmpty(root)){
    		root->data=e;
    		return true;
    	}
    	if(e>root->data){
    		InsertRight(root,e);
    	}else{
    		InsertLeft(root,e);
    	}
    }
    
    
    Status CreateBiTree(pBiNode &root,ElemType *a,int n){
    	for (int i=0;i<n;i++)
    	{
    		InsertTree(root,a[i]);
    	}
    	return true;
    }
     Status print(ElemType e ){
     	printf("%d ",e);
     	return true;
     }
    
    Status PreOrderTraverse(pBiNode root,Status(*p)(int)){
    	if(root){
    		(*p)(root->data);
    		PreOrderTraverse(root->left,p);
    		PreOrderTraverse(root->right,p);
    	}
    	return OK;
    }
    
    Status MiddleOrderTraverse(pBiNode root,Status(*p)(int)){
    	if(root){
    		MiddleOrderTraverse(root->left,p);
    		(*p)(root->data);
    		MiddleOrderTraverse(root->right,p);
    	}
    	return OK;
    }
    
    Status AfterOrderTraverse(pBiNode root,Status(*p)(int)){
    	if(root){
    		AfterOrderTraverse(root->left,p);
    		AfterOrderTraverse(root->right,p);
    		(*p)(root->data);
    	}
    	return OK;
    }
    
    Status ClearBiTree(pBiNode &root){
    	if(root){
    		ClearBiTree(root->left);
    		ClearBiTree(root->right);
    		free(root);
    		root==NULL;
    	}
    	return OK;
    }
    
    
    #endif

    3.线索二叉树代码

    #include "BiTree.h"
    
    //中序线索
    void InOrder( pBiNode root,pBiNode &pre){
    	if (root!=NULL)
    	{
    		InOrder(root->left,pre);
    		if (root->left==NULL)
    		{
    			root->left=pre;
    			root->LTag=1;
    		}
    		if (pre!=NULL && pre->right==NULL)
    		{
    			pre->right=root;
    			pre->RTag=1;
    		}
    		pre=root;
    		InOrder(root->right,pre);
    	}
    }
    //线索
    void CreateInOrder(pBiNode& root){
    	pBiNode pre=NULL;
    	if(root!=NULL){
    		InOrder(root,pre);
    		pre->right=NULL;
    		pre->RTag=1;
    	}
    }
    
    //获取头指针
    pBiNode FirstNode(pBiNode root){
    	while (root->LTag!=1)
    	{
    		root=root->left;
    	}
    	return root;
    }
    //获取下一个节点
    pBiNode NextNode(pBiNode root){
    	if (root->RTag!=1)
    	{
    		return FirstNode(root->right);
    	}else{
    		return root->right;
    	}
    }
    //遍历线索
    void InOrder(pBiNode root){
    	for (pBiNode p=FirstNode(root);p!=NULL;p=NextNode(p))
    	{
    		printf("%d ",p->data);
    	}
    }
    
    
    
    void main(){
    	ElemType a[14]={100,50,200,40,30,45,60,55,61,200,150,300,250,400};
    	pBiNode root;
    	InitBiTree(root);
    	CreateBiTree(root,a,14);
    	
    	printf("前序:");
    	PreOrderTraverse(root,print);
    	
    	printf("
    中序:");
    	MiddleOrderTraverse(root,print);
    	
    	printf("
    后序:");
    	AfterOrderTraverse(root,print);
    	
    	CreateInOrder(root);
    	
    	printf("
    线索二叉树中序:");
    	InOrder(root);
    
    
    	printf("
    ");
    	ClearBiTree(root);
    	
    }
    
    
    
    
    
    4.测试结果

    前序:100 50 40 30 45 60 55 61 200 150 300 250 400
    中序:30 40 45 50 55 60 61 100 150 200 250 300 400
    后序:30 45 40 55 61 60 50 150 250 400 300 200 100
    线索二叉树中序:30 40 45 50 55 60 61 100 150 200 250 300 400
    
    



  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023492.html
Copyright © 2020-2023  润新知