第5章 遍历二叉树【递归遍历】

来源:互联网 发布:淘宝卖东西提成怎么算 编辑:程序博客网 时间:2024/05/22 03:02




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

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

#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;}



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

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

#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;}