数据结构:二叉树的递归遍历以及求相关数据

1、按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目。

//
// Created by CHAO on 2021-11-29.
//

// 设计并验证如下算法:按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,
// 分别求其高度、总结点数目、单分支结点数目、叶结点数目。

#include "stdio.h"
#include "stdlib.h"

typedef char Elemtype;
static int flag=0;
typedef struct node{

    char data;
    struct node *lchild;    //左子树
    struct node *rchild;    //右子树
}Bitnode,*Bitree;
//二叉树声明

void BuildBitree( Bitree *T){     //创建二叉树
    char c;
    scanf("%c",&c);
    if(c=='#')
        *T=NULL;
    else
    {
        *T=(Bitree) malloc(sizeof (Bitnode));
        BuildBitree(&(*T)->lchild);     //创建左子树
        (*T)->data=c;                   //创建根节点
        BuildBitree(&(*T)->rchild);     //创建右子树
    }
}

void visit(char c,int level){    //访问二叉树
    printf("内容为%c,在第%d层\n",c,level);
}

void TravelseBitree(Bitree T,int level){    //遍历二叉树
    if(T){
        visit(T->data,level);
        TravelseBitree(T->lchild,level+1);
        TravelseBitree(T->rchild,level+1);
        //先序遍历二叉树
    }
}

void  EqualBitree(Bitree A,Bitree B){     //判断两颗二叉树是否相等

    if(A==NULL&&B==NULL)    //AB都为空
        return;
    if((A!=NULL&&B==NULL)||(B!=NULL&&A==NULL)||(A->data!=B->data))
    {                       //数值不相同,结构不同
        flag++;
        return;
    }
    EqualBitree(A->lchild,B->lchild);
    EqualBitree(A->rchild,B->rchild);
}


int  AddNode(Bitree T){   //求总结点数
    if(T==NULL)
        return 0;
    else
    return 1+ AddNode(T->lchild)+ AddNode(T->rchild);
}


int  AloneNode(Bitree T){  //求单节点数

    if(T==NULL)     //空树
        return 0;   //
    else if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL))
        return 1+ AloneNode(T->lchild)+ AloneNode(T->rchild);
    else if(T->lchild!=NULL&&T->rchild!=NULL)
        return AloneNode(T->lchild)+ AloneNode(T->rchild);
}


int  LeafNode(Bitree T){    //求叶子结点数
    if(T==NULL)   //空树
        return 0;
    else if(T->lchild==NULL&&T->rchild==NULL)   //叶子结点
        return 1;
    else
        return LeafNode(T->lchild)+ LeafNode(T->rchild);
}


int TreeDeep(Bitree T){

    int num1=0,num2=0;
    if(T==NULL)
        return 0;
    else
    {
         num1=1+TreeDeep(T->lchild);
         num2=1+TreeDeep(T->rchild);
    }
    return num1>num2?num1:num2;
}


int main(){

    int level=1;
    int le=1;
    Bitree A=NULL;
    Bitree B=NULL;
    printf("请输入数据建立二叉树A\n");
    BuildBitree(&A);
    getchar();
    printf("请输入数据建立二叉树B\n");
    BuildBitree(&B);
    getchar();
    TravelseBitree(A,level);   //遍历二叉树
   // TravelseBitree(B,le);
    EqualBitree(A,B);     //是否相等
    if(flag==0)
        printf("两棵树相同\n");
    else
        printf("两棵树不相同\n");
    printf("叶子结点数目为%d\n", LeafNode(A));
    printf("总结点数为%d\n", AddNode(A));
    printf("单节点数目为%d\n", AloneNode(A));
    printf("深度为%d", TreeDeep(A));
    return 0;
}

在这里插入图片描述
1.输入二叉树的数据时按照先序的输入方式进行输入, 程序会用中序的方法来创建二叉树,注意若结点没有子树,需要用‘#’来代替,提供一种输入:
AB#D##CE###
2.输入完第一棵树后需要输入第二颗树的数据,与输入第一颗时相同。
3.输入完成后程序会判断两棵树是否相等,相等时在数据以及结构上都相等,然后会输出树的各项指标,这里就没有输出两棵树的了,只输出了一棵树的各项指标,全输出显得有些赘余。
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江景.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值