zoukankan      html  css  js  c++  java
  • <二叉树的基本操作(有层次遍历)>

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define num 100
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -1
    #define FALSE 0
    #define TRUE 1
    
    typedef int Status;
    typedef char DataType;
    
    typedef struct node
    {
        DataType data;
        struct node *lchild,*rchild;
    }BinTNode,*BinTree;
    
    typedef BinTNode*  ElemType;
    
    #define    QueueSize 100
    //循环队列的存储结构
    typedef struct
    {
        ElemType *base;
        int front,rear;
    }SeQueue;
    
    
    Status CreateBiTree(BinTree &bt)
    {//按照先序遍历次序递归建立二叉树。
     //ABC@@DE@G@@F@@
        char ch;
        scanf("%c",&ch);
        if(ch == '@')    bt = NULL;
        else
        {
            bt = (BinTNode*)malloc(sizeof(BinTNode));
            bt->data = ch;        //生成根结点
            CreateBiTree(bt->lchild);    //构造左子树
            CreateBiTree(bt->rchild);    //构造右子树
        }
        return OK;
    }
    
    Status Inorder(BinTree bt)
    {//二叉树中序遍历非递归算法
        BinTNode *stack[num];    //定义栈数组
        int top = 0;            //初始化栈
        stack[top] = bt;
        do
        {
            while(NULL!=stack[top])
            {//扫描根结点及其所有的左结点并入栈
                top = top+1;
                stack[top] = stack[top-1]->lchild;
            }
            top = top-1;    //退栈
            if(top>=0)        //判断栈是否为空
            {
                printf("%c",stack[top]->data);    //访问结点
                stack[top] = stack[top]->rchild;    //扫描右子树
            }
        }while(top>=0);
        return OK;
    }
    
    void PostOrder(BinTree bt)
    {//二叉树后序遍历递归算法
        if(bt)
        {
            PostOrder(bt->lchild);
            PostOrder(bt->rchild);
            printf("%c",bt->data);
        }
    
    }
    
    int Size(BinTree bt)
    {//统计二叉树中所有结点的个数
        int num1,num2;
        if(bt==NULL)
            return 0;
        else if(bt->lchild==NULL && bt->rchild==NULL)
            return 1;
        else
        {
            num1 = Size(bt->lchild);
            num2 = Size(bt->rchild);
            return (num1+num2+1);
        }
    }
    
    int LeafCount(BinTree bt)
    {//叶子结点总数为
        int LeafNum;
        if(bt==NULL)
            LeafNum = 0;
        else if((bt->lchild==NULL) && (bt->rchild==NULL))    LeafNum = 1;
        else LeafNum = LeafCount(bt->lchild)+LeafCount(bt->rchild);
        //叶子数为左右子树叶子数目之和
        return LeafNum;
    }
    
    int Depth(BinTree bt)
    {//统计二叉树深度
        int hl,hr,max;
        if(bt!=NULL)
        {
            hl = Depth(bt->lchild);    //求左子树的深度
            hr = Depth(bt->rchild);    //求右子树的深度
            max = hl>hr?hl:hr;
            return (max+1);    //返回树的深度
        }
        else
            return 0;
    }
    
    void Exchange(BinTree bt)
    {//交换左右二叉树
        if(bt == NULL)
            return;
        BinTNode *temp;
        temp = bt->lchild;
        bt->lchild = bt->rchild;
        bt->rchild = temp;
        Exchange(bt->lchild);
        Exchange(bt->rchild);
    }
    
    //构造一个循环队列
    Status InitQueue(SeQueue &Q)
    {
        Q.base = (ElemType *)malloc(QueueSize *sizeof(ElemType));
        if(!Q.base)    exit(0);
        Q.front = Q.rear = 0;
        return    OK;
    }
    //插入新的元素为队尾元素
    Status EnQueue(SeQueue &Q,ElemType e)
    {
        if((Q.rear+1)%QueueSize==Q.front)
        {
            printf("Queue overflow");
            return 0;
        }
        Q.base[Q.rear] = e;
        Q.rear = (Q.rear+1)%QueueSize;
        return 1;
    }
    
    //删除队头元素
    Status DeleteQ(SeQueue &Q,ElemType &e)
    {
        if(Q.front == Q.rear)
        {
            printf("Queue enpty");
            return ERROR;
        }
        e = Q.base[Q.front];
        Q.front = (Q.front+1)%QueueSize;
        return    OK;
    }
    
    //判空循环队列
    Status IsEmptyQ(SeQueue Q)
    {
        if(Q.front == Q.rear)
            return TRUE;
        else
            return FALSE;
    }
    //层次遍历二叉树
    void LevelOrderTraversal(BinTree bt)
    {
        SeQueue Q;
        ElemType e;
    //若是空树,则直接返回
        InitQueue(Q);    //创建并初始化队列
        if(bt)  EnQueue(Q,bt);
        while(!IsEmptyQ(Q))
        {
            DeleteQ(Q,e);
            printf("%4c",e->data);
            if(e->lchild)    EnQueue(Q,e->lchild);
            if(e->rchild)   EnQueue(Q,e->rchild);
        }
    }
    
    void main()
    {
        BinTree bt;
        int xz = 1;
        int yz,sd;
        while(xz)
        {
            printf("二叉树的建立及其基本操作
    ");
            printf("===========================
    ");
            printf("1,建立二叉树的存储结构
    ");
            printf("2,二叉树的基本操作
    ");
            printf("3,交换二叉树的左右
    ");
            printf("4,二叉树的层次遍历
    ");
            printf("0退出系统
    ");
            printf("==========================
    ");
            printf("请选择:(0~4)
    ");
            scanf("%d",&xz);
            getchar();
            switch(xz)
            {//输入:ABC@@DE@G@@F@@@输出:CBEGDFA
            case 1:
                printf("输入二叉树的先序序列结点值:
    ");
                CreateBiTree(bt);
                printf("二叉树的链式存储结构建立完成
    ");
                printf("
    ");
                break;
            case 2:
                printf("该二叉树的后序遍历序列是:");
                PostOrder(bt);
                printf("
    ");    //输出CGEFDBA
                printf("该二叉树的中序遍历序列是:");
                Inorder(bt);
                printf("
    ");    //输出CBEGDFA
                printf("该二叉树的结点的个树是:%d
    ",Size(bt));
                yz = LeafCount(bt);
                printf("叶子结点个数是:%d
    ",yz);
                sd = Depth(bt);
                printf("该二叉树的深度是:%d
    ",sd);
                printf("
    ");
                break;
            case 3:
                Exchange(bt);
                printf("该二叉树已交换左右子树!
    ");
                printf("
    ");
                break;
            case 4:
                printf("该二叉树的层序遍历序列是:");
                LevelOrderTraversal(bt);
                printf("
    ");    //输出ABCDEFG
                break;
            case 0:
                break;
            default:printf("请输入正确的选项:(0~4):
    ");
    
            }
        }
    }

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/sun-/p/5043579.html
Copyright © 2011-2022 走看看