• 第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;
    }
  • 相关阅读:
    【转载】中文分词整理
    【转载】浅谈事件冒泡与事件捕获
    【转载】SpringCloud-Eurek 心跳阈值说明
    【转载】Linux下查看CPU、内存占用率
    Linux内存、性能诊断中vmstat命令的详解
    【转载】springboot四 全局异常处理
    【转载】linux系统时间自动同步:ntp
    springboot整合三 共享session,集成springsession
    git把一个分支上的某个提交合并到另一个分支
    VS Code打开新的文件会覆盖窗口中的,怎么改
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7868592.html
Copyright © 2020-2023  润新知