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;
    }
  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7868592.html
Copyright © 2011-2022 走看看