zoukankan      html  css  js  c++  java
  • 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)

    数据结构作业模板存档

    #include<stdio.h>
    #include <cstdlib>
    #include <iostream>
    #include <stack>
    #include<queue>
    using namespace std;
    
    //二叉树定义
    typedef char ElementType;
    
    typedef struct BiTreeNode
    {
        ElementType data;
        struct BiTreeNode* lchild;
        struct BiTreeNode* rchild;
    } BiTreeNode, *BiTree;
    
    
    //递归的建立一棵二叉树
    //输入为二叉树的先序序列
    void createBiTree(BiTree &T)
    {
        char data;
        data = getchar();
        if(data == '#')
        {
            T = NULL;
        }
        else
        {
            T = new BiTreeNode;
            T->data = data;
            createBiTree(T->lchild);
            createBiTree(T->rchild);
        }
    }
    void creatBiTree_2(BiTree &rt,int n)///层序遍历建树
    {
        char root[2];
        scanf("%s",root);
        rt=new BiTreeNode;
        rt->data=root[0];
        for(int i=2; i<=n; i++)
        {
            BiTreeNode* T=rt;
            char tmp[2];
            int num=0,a[16];
            scanf("%s",tmp);
            int ii=i;
            while(ii)
            {
                a[num++]=ii%2;
                ii/=2;
            }
            BiTreeNode *node=new BiTreeNode;
            node->data=tmp[0];
            node->rchild=NULL;
            node->lchild=NULL;
            for(int j=num-2; j>0; j--)
                if(a[j])T=T->rchild;
                else T=T->lchild;
            if(a[0])T->rchild=node;
            else T->lchild=node;
        }
    }
    int Nodenum(BiTreeNode* root)//二叉树节点数目
    {
        if(root == NULL) return 0;
        else return 1+Nodenum(root->lchild)+Nodenum(root->rchild);
    }
    //递归销毁一棵二叉树
    void destroyBiTree(BiTree &T)
    {
        if(T)
        {
            destroyBiTree(T->lchild);
            destroyBiTree(T->rchild);
            delete T;
            T = NULL;
        }
    }
    
    //递归先序遍历二叉树
    void preOrderTraverse(const BiTree &T)
    {
        if(T)
        {
    //        cout<<T->data<<" ";//输出根节点值
            printf("%c ",T->data);
            preOrderTraverse(T->lchild);//遍历左子树
            preOrderTraverse(T->rchild);//遍历右子树
        }
    }
    
    //递归中序遍历二叉树
    void inOrderTraverse(const BiTree &T)
    {
        if(T)
        {
            inOrderTraverse(T->lchild);//遍历左子树
    //        cout<<T->data<<" ";//输出根节点值
            printf("%c ",T->data);
            inOrderTraverse(T->rchild);//遍历右子树
        }
    }
    
    //递归后序遍历二叉树
    void postOrderTraverse(const BiTree &T)
    {
        if(T)
        {
            postOrderTraverse(T->lchild);//遍历左子树
            postOrderTraverse(T->rchild);//遍历右子树
            printf("%c ",T->data);
    //        cout<<T->data<<" ";//输出根节点值
        }
    }
    
    //递归求树的深度
    int depthOfBiTree(const BiTree &T)
    {
        int ldepth;
        int rdepth;
    
        if(T==NULL)//空树
            return 0;
        ldepth = depthOfBiTree(T->lchild);
        rdepth = depthOfBiTree(T->rchild);
    
        return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
    }
    
    //递归求二叉树的叶子结点个数
    int leafCountOfBiTree(const BiTree &T)
    {
        if(T==NULL)
            return 0;
        if(T->lchild==NULL && T->rchild==NULL)
            return 1;
        return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
    }
    
    void exchangeChild(BiTree &T)///交换左右子树
    {
        if(T)
        {
            BiTree temp = NULL;
    
            if(T->lchild ||T->rchild)
            {
                temp = T->lchild;
                T->lchild = T->rchild;
                T->rchild = temp;
                exchangeChild(T->lchild);
                exchangeChild(T->rchild);
            }
        }
    }
    void LevelOrderTraverse(BiTree T)///层序遍历
    {
        //Visit是对节点操作的应用函数,
        //在这里,对每个数据元素调用函数Visit,也即是遍历了该节点
        queue<BiTree>q;
        BiTree p;
        if(T)
        {
            q.push(T);
            while(!q.empty())
            {
                p=q.front();
                q.pop();
                printf("%c ",p->data);
                if(p->lchild!=NULL) q.push(p->lchild);
                if(p->rchild!=NULL) q.push(p->rchild);
            }
            printf("
    ");
        }
    }
    int main()
    {
        BiTree T = NULL;
    
        createBiTree(T);//建立二叉树 AB#D##CE###
    
        printf("先序遍历: "); //先序遍历
        preOrderTraverse(T);
        printf("
    ");
    
        printf("中序遍历: ");//中序遍历
        inOrderTraverse(T);
        printf("
    ");
    
        printf("后序遍历: ");//后序遍历
        postOrderTraverse(T);
        printf("
    ");
    
        printf("层序遍历: ");
        LevelOrderTraverse(T);
    
        printf("交换左右子树: 
    ");
        exchangeChild(T);
    
        printf("先序遍历: "); //先序遍历
        preOrderTraverse(T);
        printf("
    ");
    
        printf("中序遍历: ");//中序遍历
        inOrderTraverse(T);
        printf("
    ");
    
        printf("后序遍历: ");//后序遍历
        postOrderTraverse(T);
        printf("
    ");
    
        printf("层序遍历: ");
        LevelOrderTraverse(T);
    
        printf("深度: %d
    ",depthOfBiTree(T));//树的高度
    
        printf("叶子结点数: %d
    ",leafCountOfBiTree(T));//叶子结点数
    
        printf("总结点数量: %d
    ",Nodenum(T));
        destroyBiTree(T);//销毁二叉树,释放空间
    
    ///================================================================
    
        int n;
        scanf("%d",&n);
        BiTree TT=NULL;
        creatBiTree_2(TT,n);
    
        printf("先序遍历: "); //先序遍历
        preOrderTraverse(TT);
        printf("
    ");
    
        printf("中序遍历: ");//中序遍历
        inOrderTraverse(TT);
        printf("
    ");
    
        printf("后序遍历: ");//后序遍历
        postOrderTraverse(TT);
        printf("
    ");
    
    
        printf("深度: %d
    ",depthOfBiTree(TT));//树的高度
    
        printf("叶子结点数: %d
    ",leafCountOfBiTree(TT));//叶子结点数
    
        printf("总结点数量: %d
    ",Nodenum(TT));
        destroyBiTree(TT);//销毁二叉树,释放空间
        system("PAUSE");
        return EXIT_SUCCESS;
    }
  • 相关阅读:
    Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks
    Appium,安装WebDriverAgent(WDA)
    Charles界面介绍及使用方法
    手机通过Charles抓取https包
    jacoco统计server端功能测试覆盖率
    Android学习路-activity活动
    Android学习路-Android Studio的工程目录
    js实现多级复选框的交互
    python3使用paramiko操作远程机器
    ubuntu中查看各种设备和资源的命令汇总
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11794312.html
Copyright © 2011-2022 走看看