C语言--数据结构--实现先序遍历、中序遍历、后序遍历、二叉树的高度、二叉树结点总数;

 掌握二叉树的二叉链表存储结构的表示与实现,掌握和验证在二叉链表存储结构下完成二叉树的遍历及其应用操作的实现方法;

1)结构体

typedef struct Node//二叉树的二叉链表存储表示;

{

    char data;//节点数据域;

    struct Node*lchild;//左孩子指针;

    struct Node*rchild;//右孩子指针;

} Node,*Tree;

2)创建二叉树便于下一步操作

void CreateTree(Tree*T)

//先序创建二叉树;

{

    char ch;

    scanf("%c",&ch);//输入字符;

    if(ch=='#')

        (*T)=NULL;//递归结束,为空树;

    else

    {

        *T=(Tree)malloc(sizeof(Node));//创建二叉树空间;

        (*T)->data=ch;//根节点数据域置为ch;

        CreateTree(&(*T)->lchild);//递归创建左子树;

        CreateTree(&(*T)->rchild);//递归创建右子树;



    }

}

三种遍历方法: 

1、先序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。(根,左,右)
2、中序遍历:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点(左,根,右)
3、后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。(左,右,根)

void PreOrderTraverse(Tree T)

//先序遍历二叉树;根,左,右;

{

    if(T)//如果T非空;

    {

        printf("%c",T->data);

        PreOrderTraverse(T->lchild);//先序遍历左子树;

        PreOrderTraverse (T->rchild);//先序遍历右子树;



    }

}



void InOrderTraverse(Tree T)

//中序遍历二叉树;左,根,右;

{



    if(T)//如果T非空;

    {



        PreOrderTraverse(T->lchild);//中序遍历左子树;

        printf("%c",T->data);

        PreOrderTraverse (T->rchild);//中序遍历右子树;

    }

}



void PostOrderTraverse(Tree T)

//后序遍历二叉树;左,右,根;

{



    if(T)//如果T非空;

    {



        PreOrderTraverse(T->lchild);//后序遍历左子树;

        PreOrderTraverse (T->rchild);//后序遍历右子树;

        printf("%c",T->data);

    }

}

 计算二叉树的高度

int Depth(Tree T)

//计算二叉树的高度;

{

    int m,n;



    if(T==NULL) return 0;//如果是空树,高度为0;

    else

    {

        m=Depth(T->lchild);//递归计算左子树的高度;

        n=Depth(T->rchild);//递归计算右子树的高度;

        if(m>n)

        {

            return (m+1);   //二叉树的高度为左右子树较大者+1;

        }

        else return (n+1);

    }



}

 计算二叉树的节点个数

int NodeCount(Tree T)

//统计二叉树的节点个数;

{

    if(T==NULL) return 0;//如果是空树,节点个数为0;

    else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;

    //节点个数=左子树节点+右子树节点+根节点;

}

main函数 

int main( )

{



    printf("创建一个带节点的二叉树链表: ");

    Tree T=NULL;//此时未创建二叉树;

    CreateTree(&T);//& 创立一颗二叉树;

    printf("先序遍历二叉树为:");

    PreOrderTraverse(T);

    printf(" ");

    printf("中序遍历二叉树为:");

    InOrderTraverse(T);

    printf(" ");

    printf("后序遍历二叉树为:");

    PostOrderTraverse(T);

    printf(" ");

    printf("二叉树的高度为:%d ",Depth(T));

    printf("二叉树的节点总数为:%d ",NodeCount(T));



}

全部代码的实现: 

#include<stdio.h>

#include<stdlib.h>



typedef struct Node//二叉树的二叉链表存储表示;

{

    char data;//节点数据域;

    struct Node*lchild;//左孩子指针;

    struct Node*rchild;//右孩子指针;

} Node,*Tree;



void CreateTree(Tree*T)

//先序创建二叉树;

{

    char ch;

    scanf("%c",&ch);//输入字符;

    if(ch=='#')

        (*T)=NULL;//递归结束,为空树;

    else

    {

        *T=(Tree)malloc(sizeof(Node));//创建二叉树空间;

        (*T)->data=ch;//根节点数据域置为ch;

        CreateTree(&(*T)->lchild);//递归创建左子树;

        CreateTree(&(*T)->rchild);//递归创建右子树;



    }

}



void PreOrderTraverse(Tree T)

//先序遍历二叉树;根,左,右;

{

    if(T)//如果T非空;

    {

        printf("%c",T->data);

        PreOrderTraverse(T->lchild);//先序遍历左子树;

        PreOrderTraverse (T->rchild);//先序遍历右子树;



    }

}



void InOrderTraverse(Tree T)

//中序遍历二叉树;左,根,右;

{



    if(T)//如果T非空;

    {



        PreOrderTraverse(T->lchild);//中序遍历左子树;

        printf("%c",T->data);

        PreOrderTraverse (T->rchild);//中序遍历右子树;

    }

}



void PostOrderTraverse(Tree T)

//后序遍历二叉树;左,右,根;

{



    if(T)//如果T非空;

    {



        PreOrderTraverse(T->lchild);//后序遍历左子树;

        PreOrderTraverse (T->rchild);//后序遍历右子树;

        printf("%c",T->data);

    }

}



int Depth(Tree T)

//计算二叉树的高度;

{

    int m,n;



    if(T==NULL) return 0;//如果是空树,高度为0;

    else

    {

        m=Depth(T->lchild);//递归计算左子树的高度;

        n=Depth(T->rchild);//递归计算右子树的高度;

        if(m>n)

        {

            return (m+1);   //二叉树的高度为左右子树较大者+1;

        }

        else return (n+1);

    }



}



int NodeCount(Tree T)

//统计二叉树的节点个数;

{

    if(T==NULL) return 0;//如果是空树,节点个数为0;

    else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;

    //节点个数=左子树节点+右子树节点+根节点;

}

int main( )

{



    printf("创建一个带节点的二叉树链表: ");

    Tree T=NULL;//此时未创建二叉树;

    CreateTree(&T);//& 创立一颗二叉树;

    printf("先序遍历二叉树为:");

    PreOrderTraverse(T);

    printf(" ");

    printf("中序遍历二叉树为:");

    InOrderTraverse(T);

    printf(" ");

    printf("后序遍历二叉树为:");

    PostOrderTraverse(T);

    printf(" ");

    printf("二叉树的高度为:%d ",Depth(T));

    printf("二叉树的节点总数为:%d ",NodeCount(T));



}

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小孙同志在学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值