。。。

导航

第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("请按照先序遍历的顺序建立二叉树\n");
    CreateBiTree(T);
    printf("先序遍历输出为\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("中序遍历输出为\n");
    InOrderTraverse(T); 
    printf("\n");
    printf("后序遍历输出为\n");
    PostOrderTraverse(T);
    printf("\n");
    Copy(T,NewT);
    printf("复制后的二叉树中序遍历输出为\n");
    InOrderTraverse(NewT);
    printf("\n");
    printf("结点的深度为%d\n",Depth(T)) ;
    printf("结点的个数为%d\n",NodeCount(T));
    return 0;
}

 

posted on 2017-11-20 22:29  大学僧  阅读(236)  评论(0编辑  收藏  举报