zoukankan      html  css  js  c++  java
  • 二叉树【操作】

    二叉树

    二叉树操作1

    #include<stdio.h> //' '空格代表树的元素为空
    #include<stdlib.h>
    #define OVERFLOW -1
    typedef char TElemType;
    typedef struct BitNode
    {
        TElemType data;
        struct BitNode *lchild,*rchild;
    }BitNode,*BitTree;
    typedef struct QNode
    {
        BitNode data;
        struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct
    {
        QueuePtr front;
        QueuePtr rear;
    }LinkQueue;
    void BinTreeInit(BitNode **BT)  //初始化二叉树
    {
        *BT=NULL;
    }
    BitNode *BinTreeCreat(BitNode *BT) //按先序次序构造二叉树
    {
        char c;
        scanf("%c",&c);
        if(c==' ')BT=NULL;
        else
        {
            if(!(BT=(BitTree)malloc(sizeof(BitNode))))
                exit(OVERFLOW);
            BT->data=c;
            BT->lchild=BinTreeCreat(BT->lchild); //注意因为有返回值,必须有左值
            BT->rchild=BinTreeCreat(BT->rchild);
        }
        return BT;
    }
    int BinTreeEmpty(BitNode *BT)//检查二叉树是否为空
    {
        if(BT==NULL)return 1;
        else return 0;    
    }
    void visit(BitNode *BT) //visit函数
    {
        printf("%c",BT->data);    
    }
    void PreOrderTraverse(BitNode *BT)//先序遍历树
    {
        if(BT)
        {
        visit(BT);
        PreOrderTraverse(BT->lchild);
        PreOrderTraverse(BT->rchild);
        }
    }
    void InOrderTraverse(BitNode *BT)//中序遍历树
    {
        if(BT)
        {
        InOrderTraverse(BT->lchild);
        visit(BT);
        InOrderTraverse(BT->rchild);
        }
    }
    void PostOrderTraverse(BitNode *BT)//后序遍历树
    {    
        if(BT)
        {
        PostOrderTraverse(BT->lchild);
        PostOrderTraverse(BT->rchild);
        visit(BT);
        }
    }
    void InitQueue(LinkQueue *Q) //构造一个空的队列
    {
        Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
        if(!Q->front)exit(OVERFLOW);
        Q->front->next=NULL;
    }
    int QueueEmpty(LinkQueue *Q)
    {
        if(Q->rear==Q->front)return 1;
        else return 0;
    }
    void EnQueue(LinkQueue *Q,BitNode e) //入队
    {
        QNode *p;
        p=(QueuePtr)malloc(sizeof(QNode));
        if(!p)exit(OVERFLOW);
        p->data=e;
        p->next=NULL;
        Q->rear->next=p;
        Q->rear=p;
    }
    void DeQueue(LinkQueue *Q,BitNode *e)//出队
    {
        QNode *p;
        p=Q->front->next;
        *e=p->data;
        Q->front->next=p->next;
        if(Q->rear==p)Q->rear=Q->front;
        free(p);
    }
    void BFSTraverse(BitNode *BT)//层次遍历树
    {
        BitNode m;
        LinkQueue Q;
        InitQueue(&Q);
        EnQueue(&Q,*BT);
        while(!QueueEmpty(&Q))
        {
            DeQueue(&Q,&m);
            visit(&m);
            if(m.lchild)EnQueue(&Q,*(m.lchild));
            if(m.rchild)EnQueue(&Q,*(m.rchild));
        }    
    }
    int BinTreeDepth(BitNode *BT)//求二叉树的深度
    {
        int dep1,dep2;
        if(BT==NULL)return 0;
        else 
        {
            dep1=BinTreeDepth(BT->lchild);
            dep2=BinTreeDepth(BT->rchild);
            if(dep1>dep2)return 1+dep1;
            else return 1+dep2;
        }
    }
    void BinCountleaf(BitNode *BT,int *count)//求二叉树的叶子节点的个数
    {
        if(BT)
        {
            if(!BT->lchild&&!BT->rchild)(*count)++;
            BinCountleaf(BT->lchild,count);
            BinCountleaf(BT->rchild,count);
        }        
    }
    void BinTreeClear(BitNode **BT)//清除二叉树
    {
        if(*BT)
        {
            BinTreeClear(&(*BT)->lchild);
            BinTreeClear(&(*BT)->rchild);
            free(*BT);
            *BT=NULL;
        }
    }
    int main()
    {
        int count=0;
        BitNode *BT=NULL;
        BinTreeInit(&BT); //初始化二叉树
        BT=BinTreeCreat(BT);//构造二叉树
        printf("执行创建树操作后: ");
        if(BinTreeEmpty(BT))printf("树空
    ");//判空
        else printf("树不空
    ");
        printf("先序遍历二叉树: ");
        PreOrderTraverse(BT);printf("
    ");
        printf("中序遍历二叉树: ");
        InOrderTraverse(BT);printf("
    ");
        printf("后序遍历二叉树: ");
        PostOrderTraverse(BT);printf("
    ");
        printf("层次遍历二叉树: ");
        BFSTraverse(BT);printf("
    ");
        printf("二叉树的深度为:%d
    ",BinTreeDepth(BT));//求二叉树的深度
        BinCountleaf(BT,&count);//求二叉树中的节点个数
        printf("二叉树的叶子节点个数为:%d
    ",count);
        BinTreeClear(&BT);//清空树
        printf("执行清空树操作后: ");
        if(BinTreeEmpty(BT)==1)printf("树空
    ");//判空
        else printf("树不空
    ");
    
        return 0;
    }          
    
    
     或者将构造二叉树的操作改为,main函数里对此函数的调用扫做修改即可:
    
    void BinTreeCreat(BitNode **BT) //按先序次序构造二叉树
    {
    	char c;
    	scanf("%c",&c);
    	if(c==' ')*BT=NULL;//此处曾把'*'漏掉
    	else
    	{
    		if(!((*BT)=(BitTree)malloc(sizeof(BitNode))))
    			exit(OVERFLOW);
    		(*BT)->data=c;
    		printf("%c",(*BT)->data);
    		BinTreeCreat(&(*BT)->lchild); 
    		BinTreeCreat(&(*BT)->rchild);
    	}
    }
    

    二叉树操作2

    #include "string.h"  
    #include "stdio.h"      
    #include "stdlib.h"     
    #include "io.h"    
    #include "math.h"    
    #include "time.h"  
      
    #define OK 1  
    #define ERROR 0  
    #define TRUE 1  
    #define FALSE 0  
    #define MAXSIZE 100                             /* 存储空间初始分配量 */  
      
    typedef int Status;                             /* Status是函数的类型,其值是函数结果状态代码,如OK等 */  
      
    /**********定义二叉树的存储结构************/  
    typedef char TElemType;  
    TElemType Nil=' ';                              /* 字符型以空格符为空 */  
      
    typedef struct BinTreeNode                      /* 结点结构 */  
    {  
        TElemType data;                             /* 结点数据 */  
        struct BinTreeNode *lchild,*rchild;         /* 左右孩子指针 */  
    }BinTreeNode,*BinTree;  
    /*****************************************/  
      
    /***********用于构造二叉树************** */  
    int index=1; 
    //自定义了一个字符数组类型 
    typedef char charArray[24];                     /*声明一个char类型数组,charArray是数组名也是一个指针*/  
    charArray str;									//str字符数组类型的数组名,charArray等价于char *  
      
    Status AssignStr(charArray T,char *chars)		//char *chars是字符类型的指针变量
    {   
        int i;  
        if(strlen(chars)>MAXSIZE) return ERROR;     /*输入字符的长度超过存储空间最大值*/  
        else  
        {  
            T[0]=strlen(chars);                     /*0号单元存放字符串长度*/  
            for(i=1;i<=T[0];i++)  
            {  
                T[i]=*(chars+i-1);					//先将数据进行存储               
            }   
            return OK;
        }  
    }  
    /* ************************************* */  
      
    /*构造二叉树*/  
    void CreateBinTree(BinTree *T)  
    {   
        TElemType ch;  
        ch=str[index++];  
    
        if(ch=='#')   
            *T=NULL;  
        else  
        {  
            *T=(BinTree)malloc(sizeof(BinTreeNode));  
            if(!*T)  
                exit(OVERFLOW);  
            (*T)->data=ch;                            /* 生成根结点 */  
            CreateBinTree(&(*T)->lchild);             /* 构造左子树 */  
            CreateBinTree(&(*T)->rchild);             /* 构造右子树 */  
        }  
    }  
      
    /* 构造空二叉树*/  
    Status InitBinTree(BinTree *T)  
    {   
        *T=NULL;  
        return OK;  
    }  
      
    /*清空二叉树*/  
    void ClearBinTree(BinTree *T)  
    {   
        if(*T)   
        {  
            if((*T)->lchild)                           /* 有左孩子 */  
                ClearBinTree(&(*T)->lchild);           /* 销毁左孩子子树 */  
            if((*T)->rchild)                           /* 有右孩子 */  
                ClearBinTree(&(*T)->rchild);           /* 销毁右孩子子树 */  
            free(*T);                                  /* 释放根结点 */  
            *T=NULL;                                   /* 空指针赋0 */  
        }  
    }  
      
    /*判断二叉树是否为空*/  
    Status IsBinTreeEmpty(BinTree T)  
    {   
        if(T)  
            return FALSE;  
        else  
            return TRUE;  
    }  
      
    /*计算二叉树的深度*/  
    int GetDepth(BinTree T)  
    {  
        int i,j;  
        if(!T)  
            return 0;  
        if(T->lchild)  
            i=GetDepth(T->lchild);  
        else  
            i=0;  
        if(T->rchild)  
            j=GetDepth(T->rchild);  
        else  
            j=0;  
        return i>j?i+1:j+1;  
    }  
      
    /*获取二叉树的根节点*/  
    TElemType GetRoot(BinTree T)  
    {   
        if(IsBinTreeEmpty(T))  
            return Nil;                                 /*Nil表示空字符*/  
        else  
            return T->data;  
    }  
      
    /*前序遍历 
    思路:访问根节点--->前序遍历左子树--->前序遍历右子树 
    */  
    void PreOrderTraverse(BinTree T)  
    {   
        if(T==NULL) return;  
      
        printf("%c ",T->data);                           /* 显示结点数据,可以更改为其它对结点操作 */  
        PreOrderTraverse(T->lchild);                     /* 再先序遍历左子树 */  
        PreOrderTraverse(T->rchild);                     /* 最后先序遍历右子树 */  
    }  
      
    /*中序遍历 
    思路:中序遍历左子树--->访问根节点--->中序遍历右子树 
    */  
    void InOrderTraverse(BinTree T)  
    {   
        if(T==NULL) return;  
      
        InOrderTraverse(T->lchild);                       /* 中序遍历左子树 */  
        printf("%c ",T->data);                            /* 显示结点数据,可以更改为其它对结点操作 */  
        InOrderTraverse(T->rchild);                       /* 最后中序遍历右子树 */  
    }  
      
    /*后序遍历 
    思路:后序遍历左子树--->后序遍历右子树--->访问根节点 
    */  
    void PostOrderTraverse(BinTree T)  
    {  
        if(T==NULL) return;  
      
        PostOrderTraverse(T->lchild);                      /* 先后序遍历左子树  */  
        PostOrderTraverse(T->rchild);                      /* 再后序遍历右子树  */  
        printf("%c ",T->data);                             /* 显示结点数据,可以更改为其它对结点操作 */  
    }  
      
      
    int main()  
    {  
        int i;  
        BinTree T;  
        TElemType e1;  
      
        /*初始化二叉树为一棵空树*/  
        InitBinTree(&T);  
      
        /*设置字符数组用于构造二叉树*/  
        AssignStr(str,"ABDH#K###E##CFI###G#J##"); 
    	
        /*创建二叉树*/  
        CreateBinTree(&T);  
        printf("创建二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d
    ",IsBinTreeEmpty(T),GetDepth(T));  
      
        /*获取二叉树的根节点*/  
        e1=GetRoot(T);  
        printf("
    二叉树的根为: %c
    ",e1);  
      
        /*前序遍历*/  
        printf("
    前序遍历二叉树:");  
        PreOrderTraverse(T);  
      
        /*中序遍历*/  
        printf("
    中序遍历二叉树:");  
        InOrderTraverse(T);  
      
        /*后序遍历*/  
        printf("
    后序遍历二叉树:");  
        PostOrderTraverse(T);  
      
        /*清空二叉树*/  
        ClearBinTree(&T);  
        printf("
    
    清除二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d
    ",IsBinTreeEmpty(T),GetDepth(T));  
        i=GetRoot(T);  
        if(!i) printf("树空,无根
    ");  
      
        getchar();  
    }  
    

      

      

  • 相关阅读:
    线程同步
    快捷键之Sublime
    快捷键之Idea
    快捷键之Chrome
    20155219付颖卓《网络对抗》逆向及Bof基础
    20155219 《嵌入式基础》
    20155219 《信息安全系统设计基础》课程总结
    20155219 《信息安全系统设计基础》第十四周学习总结
    20155219 《信息安全系统设计基础》第十三周学习总结
    2017-2018-1 20155219《信息安全系统设计基础》 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/wxt19941024/p/7131155.html
Copyright © 2011-2022 走看看