• 第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;
    }
  • 相关阅读:
    iOS-runtime-objc_setAssociatedObject(关联对象以及传值)
    iOS-runtime-根据类名推送到任意控制器,且实现属性传值
    程序员必须知道的git托管平台
    iOS第三方地图-百度地图中心点定位
    nested pop animation can result in corrupted navigation bar
    iOS KVC,KVO
    iOS第三方地图-百度地图定位的封装
    iOS第三方地图-百度地图常用功能使用(POI搜索,地理正反编码,定位,添加标注)
    MJRefresh插件引起的错误
    OC开发_Storyboard——AutoLayout
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7868592.html
Copyright © 2020-2023  润新知