zoukankan      html  css  js  c++  java
  • 第5章 遍历二叉树【递归遍历】

    一开始本姑娘想来一波神奇的操作让二叉树甘拜于我的键盘之下,然鹅发现,我去,二叉树原来这么奇葩。

    然后呢,本姑娘就下定决心从简单的开始写,我就不信,指针都被我啃下来了,二叉树我还搞不定你,哼~

    #include<stdio.h>
    #include<malloc.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    #define MAXSIZE 1000 
    typedef char TElemType;
    //------------二叉树的二叉链表存储表示---------- 
    typedef struct BiTNode{
        TElemType data;//结点数据域 
        struct BiTNode *lchild,*rhild;//左右孩子指针 
    }BiTNode,*BiTree;
                                                                                                                                                                                                                                                                                                                                                                                                                                          
    void CreateBiTree(BiTree &T)
    {
        char ch;
        cin>>ch;
        if(ch == '#')//递归结束建空树 
        {
            T = NULL;
        }
        else
        {
            T = (BiTree)malloc(sizeof(BiTNode));//生成根节点 
            T->data = ch;//根节点的数据域置为空 
            CreateBiTree(T->lchild );//递归创建左子树 
            CreateBiTree(T->rhild);//递归创建右子树 
        }
        return ;
    }
    void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法 
    {
        if(T)//若二叉树非空 
        {
            cout<<T->data ;//访问根节点 
            PreOrderTraverse(T->lchild );//先序遍历左子树 
            PreOrderTraverse(T->rhild );//先序遍历右子树 
        }
        return;
    }
    
    void InOrderTraverse(BiTree T)//中序遍历二叉树的递归算法 
    {
        if(T)//若二叉树非空 
        {
            InOrderTraverse(T->lchild );//中序遍历左子树 
            cout<<T->data ;//访问根节点 
            InOrderTraverse(T->rhild );//中序遍历右子树 
        }
    }
    
    void PostOrderTraverse(BiTree T)
    {
        if(T)//若二叉树非空 
        {
            PostOrderTraverse(T->lchild );//后序遍历左子树 
            PostOrderTraverse(T->rhild );//后序遍历右子树 
            cout<<T->data ;//访问根节点 
        }
    }
    
    void Copy(BiTree T,BiTree &NewT)//二叉树复制 ,复制一棵和T完全相同的二叉树 
    {
        if(T == NULL)// 如果是空树,递归结束 
        {
            NewT = NULL;
            return;
        }
        else
        {
            NewT = (BiTree)malloc(sizeof(BiTNode));
            NewT->data = T->data ;//复制根节点 
            Copy(T->lchild ,NewT->lchild );//递归复制左子树 
            Copy(T->rhild ,NewT->rhild );//递归复制右子树 
        }
        return;
    }
    
    int Depth(BiTree T)//计算二叉树的深度 
    {
        if(T==NULL)//如果是空树,深度为0,递归结束 
            return 0;
        else
        {
            int m = Depth(T->lchild );//递归计算左子树的深度m 
            int n = Depth(T->rhild );//递归计算右子树的深度n 
            if( m > n)//二叉树的深度为m与n的较大者加1 
                return (m+1);
            return (n+1);
        }
    }
    int NodeCount(BiTree T)//统计二叉树结点个数 
    {
        if(T== NULL)//如果二叉树为空,结点个数为0 
            return 0;
        else
        {
            return NodeCount(T->lchild )+NodeCount(T->rhild )+1;//左子树结点个数+右子树结点个数+1 
        }
    }
    
    
    int main()
    {
        BiTree T,NewT;
        printf("请按照先序遍历的顺序建立二叉树
    ");
        CreateBiTree(T);
        printf("先序遍历输出为
    ");
        PreOrderTraverse(T);
        printf("
    ");
        printf("中序遍历输出为
    ");
        InOrderTraverse(T); 
        printf("
    ");
        printf("后序遍历输出为
    ");
        PostOrderTraverse(T);
        printf("
    ");
        Copy(T,NewT);
        printf("复制后的二叉树中序遍历输出为
    ");
        InOrderTraverse(NewT);
        printf("
    ");
        printf("结点的深度为%d
    ",Depth(T)) ;
        printf("结点的个数为%d
    ",NodeCount(T));
        return 0;
    }
  • 相关阅读:
    二叉搜索树的建树与遍历
    SpringBoot Mybatis 读写分离配置(山东数漫江湖)
    Spring注解概览(数漫江湖)
    Spring Cloud的基本认识和使用Spring Cloud的基本教程(山东数漫江湖)
    全面了解Nginx主要应用场景(数漫江湖)
    Spring boot集成RabbitMQ(山东数漫江湖)
    Spring 事务管理(山东数漫江湖)
    透彻理解Spring事务设计思想之手写实现(山东数漫江湖)
    Spring整合Quartz分布式调度(山东数漫江湖)
    Spring归纳小结(山东数漫江湖)
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7868592.html
Copyright © 2011-2022 走看看