7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

对于给定的二叉树,输出其先序序列、中序序列、后序序列并输出叶子结点数。

二叉树.png

输入格式:

二叉树的先序遍历序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

若是非空二叉树,则输出四行内容 第一行是二叉树的先序遍历序列; 第二行是二叉树的中序遍历序列; 第三行是二叉树的后序遍历序列; 第四行是叶子结点数;

若是空二叉树 只需输出叶子数0

输入样例1:

FCA##DB###EHM###G##

结尾无空行

输出样例1:

FCADBEHMG
ACBDFMHEG
ABDCMHGEF
4

结尾无空行

输入样例2:

#

结尾无空行

输出样例2:

0

结尾无空行

#include<iostream>
using namespace std;
typedef struct bt{
    char data;
    struct bt *l,*r;
}*tree;
void create(tree &t){
    char ch;
    scanf("%c",&ch);
    if(ch=='#')t=NULL;
    else{
        t=new(struct bt);
        t->data=ch;
        create(t->l);
        create(t->r);
    }
}
 
 
void pre(tree t){
    if(t){
        printf("%c",t->data);
        pre(t->l);
        pre(t->r);
    }
}

void in(tree t){
    if(t){
        in(t->l);
        printf("%c",t->data);
        in(t->r);
    }
}

void post(tree t){
    if(t){
        post(t->l);
        post(t->r);
        printf("%c",t->data);
    }
}
 
int leaf_sum(tree t){
    if(!t)return 0;
    if(!t->l&&!t->r)return 1;
    return leaf_sum(t->l)+leaf_sum(t->r);
}
int main(){
    tree t;
    create(t);
    if(t){
        pre(t);
        printf("\n");
        in(t);
        printf("\n");
        post(t);
        printf("\n");
    }
    printf("%d",leaf_sum(t));
    return 0;
}
#include<iostream>
#include<cstdio>
#include<malloc.h>
 
 
#define OVERFLOW -2
 
 
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
 
 
void CreateBiTree(BiTree &L){
    char ch;
    scanf("%c",&ch);
    if(ch=='#')L=NULL;
    else{
        L=(BiTree)malloc(sizeof(BiTNode));
        if(!L)exit(OVERFLOW);
        L->data=ch;
        CreateBiTree(L->lchild);
        CreateBiTree(L->rchild);
    }
}
 
 
void PreOrderTraverse(BiTree L){
    if(L){
        printf("%c",L->data);
        PreOrderTraverse(L->lchild);
        PreOrderTraverse(L->rchild);
    }
}
void PostOrderTraverse(BiTree L){
    if(L){
        PostOrderTraverse(L->lchild);
        PostOrderTraverse(L->rchild);
        printf("%c",L->data);
    }
}
 
 
void InOrderTraverse(BiTree L){
    if(L){
        InOrderTraverse(L->lchild);
        printf("%c",L->data);
        InOrderTraverse(L->rchild);
    }
}
 
 
int Depth(BiTree L){
    int d1,d2,d3;
    if(!L)d1=0;
    else{
        d2=Depth(L->lchild);
        d3=Depth(L->rchild);
        d1=1+(d2>d3?d2:d3);
    }
    return d1;
}
int Leaf(BiTree L,int &c){
    if(L!=NULL){//在树不为空的时候才能讨论左右结点
        if(L->lchild==NULL&&L->rchild==NULL)c++;
        Leaf(L->lchild,c);
        Leaf(L->rchild,c);
    }
    return c;
}
void GetFloor(BiTree L,char data,int floor,int &res){
    if(L!=NULL){
        if(L->data==data){
            res=floor;
        }
        GetFloor(L->lchild,data,floor+1,res);
        GetFloor(L->rchild,data,floor+1,res);
    }
}
int c=0;
void Count(BiTree L){
    if(L!=NULL){
        c++;
        Count(L->lchild);
        Count(L->rchild);
    }
}
int main(){
    BiTree T;
    CreateBiTree(T);
    printf("先序遍历序列为:\n");
    PreOrderTraverse(T);
    printf("\n中序遍历序列为:\n");
    InOrderTraverse(T);
    printf("\n后序遍历序列为:\n");
    PostOrderTraverse(T);
    printf("\n高度:%d\n",Depth(T));
    int m=0;
    Leaf(T,m);
    printf("叶子数:%d\n",m);
    int floor=1,res;
    GetFloor(T,'D',floor,res);
    printf("在第%d层\n",res);
    Count(T);
    printf("一共有%d个结点\n",c);
}
#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include <string.h>
using namespace std;
//定义二叉树结构
typedef struct Node
{
    char data;
    struct Node *lchild,*rchild;//创建左右结点指针
}*BTree,BTNode;
//程序使用的函数
void CreateBTree(BTree &T);//按先序遍历方式创建二叉树
void PreOrderTraverse(BTree T);//先序遍历函数
void InOrderTraverse(BTree T);//中序遍历函数
void PostOrderTraverse(BTree T);//后序遍历函数
void LevelTraverse(BTree T) ;//层次遍历函数
int SearchDepth(BTree T);//求树的高度度函数
int NodeNum(BTree T);//求二叉树中结点个数函数
int LeafNum(BTree T);//求二叉树中叶子结点个数函数
void ExChangeTree(BTree &T);//左右结点交换函数

//按先序遍历方式创建二叉树
void CreateBTree(BTree &T)
{
    char ch;
    cin>>ch;//将输入的字符储存在数组ch中
    if(ch=='*')//定义符号*为空树
		T=NULL;
    else  //输入字符不为*,将其储存在树中
	{
        T=new BTNode;
        T->data=ch;
        CreateBTree(T->lchild);
        CreateBTree(T->rchild);
    }
}
//先序遍历函数
void PreOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
//中序遍历函数
void InOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }

}

//后序遍历函数
void PostOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }

}


//层次遍历函数
void LevelTraverse(BTree T)            
{
    if(T==NULL) 
	{
		printf("二叉树为空树");
		return;
	}
    BTNode *queue[50];            //创建应该队列
    int front=0;
    int rear=0;
    BTNode *p;        
    queue[rear]=T;//树根入队
    while(front!=rear)//当前端和后端不相等时
    {     
        p=queue[front];//p指向根,读出根,并出队
        printf("%c",p->data);//输出二叉树的结点
        if(p->lchild!=NULL)     //左子树不为空,入队
        {
            queue[rear]=p->lchild;
        }
        if(p->rchild!=NULL)   //右子树不为空,入队
        {
            queue[rear]=p->rchild;
        }
    }
}


//求树的高度度函数
int SearchDepth(BTree T)
{
    if(T==NULL)
	{
		return 0;
	}
    else
    {
        int m=SearchDepth(T->lchild);
        int n=SearchDepth(T->rchild);
        if(m>n) 
		{
			return (m+1);
		}
        else 
		{
			return (n+1);
		}
    }
}
//求二叉树中结点个数函数
int NodeNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    else //第一个结点不为空,结点数为左右子树数加上第一个结点
	{
		return NodeNum(T->lchild)+NodeNum(T->rchild)+1;
	}
}
//求二叉树中叶子结点个数函数
int LeafNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    if(T->lchild==NULL &&T->rchild==NULL)//如果二叉树左右子树皆为空,说明该二叉树只有根节点为叶子节点,返回值1.
	{
        return 1;
    }
	else   //否则叶子结点数为左右子树之和
	{
        return LeafNum(T->lchild)+LeafNum(T->rchild);
    }
}

//左右结点交换函数
void ExChangeTree(BTree &T)
{
    BTree tem;
    if(T!=NULL)//判断T是否为空,非空进行转换,否则不转换
	{
        tem=T->lchild;
        T->lchild=T->rchild;//直接交换节点地址
        T->rchild=tem;
        ExChangeTree(T->lchild);
        ExChangeTree(T->rchild);
    }
}

int main()//主函数调用前面子函数并输出结果
{
    BTree T;
    cout<<"按先序遍历方式创建二叉树(用*表示空树):";
    CreateBTree(T);
    cout<<"中序遍历输出结果:";
    InOrderTraverse(T);
    cout<<endl<<"先序遍历输出结果:";
    PreOrderTraverse(T);
    cout<<endl<<"后序遍历输出结果:";
    PostOrderTraverse(T);
	cout<<endl<<"层次遍历输出结果:";
	LevelTraverse(T);
    cout<<endl<<"树的高度:"<<SearchDepth(T);
    cout<<endl<<"总结点的个数:"<<NodeNum(T);
    cout<<endl<<"叶结点的个数:"<<LeafNum(T);
    BTree temporarytree=T;  //复制一颗树,在不改变原树的情况下,对临时树进行交换。
    ExChangeTree(temporarytree);
    cout<<endl<<"左右结点交换结果:";
	PreOrderTraverse(temporarytree);
	printf("\n");
    return 0;
}

  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真题OK撒

你的打赏将是我最大的创作

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

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

打赏作者

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

抵扣说明:

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

余额充值