7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
对于给定的二叉树,输出其先序序列、中序序列、后序序列并输出叶子结点数。
输入格式:
二叉树的先序遍历序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
若是非空二叉树,则输出四行内容 第一行是二叉树的先序遍历序列; 第二行是二叉树的中序遍历序列; 第三行是二叉树的后序遍历序列; 第四行是叶子结点数;
若是空二叉树 只需输出叶子数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 -2typedef 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;
}
7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)相关推荐
- 【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树
两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...
- 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)
假设二叉数的数据元素为字符,采用二叉链式存储结构.请编码实现二叉树ADT,其中包括创建二叉树.遍历二叉树(深度.广度).求二叉树的深度(高度).计算二叉树的元素个数.计算二叉树的叶子数.二叉树的格式输 ...
- 由标明空子树的先序遍历序列创建二叉树
由标明空子树的先序遍历序列创建二叉树 i=0 def createBiTree2(preOrder): # i为常数0 global i c = preOrder[i] # 取字符 if c != ' ...
- 前序中序、后序中序遍历创建二叉树,并检验是否是二叉搜索树,若是则转换为双向链表
finalbst.h //该程序的作用是根据所给的前序序列以及中序序列或者中序序列以及后序序列创建二叉树 #include <iostream> #include <vector&g ...
- XDOJ 363 输出快速排序递归算法隐含递归树的后序遍历序列 AC
像我这样的菜鸡也没有什么能输出的,好像我写题解也不算输出. 最近期末了,写数据结构实验的时候,这个题写了挺久的,搞出来记录一下. 输出快速排序递归算法隐含递归树的后序遍历序列 描述: 快速排序递归算法 ...
- 根据前序遍历和中序遍历创建二叉树
根据前序遍历和中序遍历创建二叉树 题目要求如下: 给定某一个二叉树的前序遍历和中序遍历,要求据此创建一颗符合这样遍历顺序的二叉树. 前序遍历和中序遍历的概念以及特性: 前序遍历:先遍历节点本身,再遍历 ...
- 【数据结构】先序遍历+中序遍历创建二叉树(C++实现)
创建如图所示的二叉树. 先序遍历为:ABDGECF 中序遍历为:DGBEAFC 创建结构体 定义二叉树中每个结点的数据,以及左右孩子. typedef struct BiNode {char data ...
- 计算二叉树的深度和叶子结点数(递归算法实现)
[问题描述] 计算二叉树的深度和叶子结点数 [输入形式] 输入二叉树的先序遍历序列建立二叉树. [输出形式] 输出二叉树的叶子结点数和深度. [样例输入] A B C # # # # [样例输出] L ...
- 统计二叉树中叶子结点数数据结构C语言,统计二叉树中叶子结点个数的问题,
#include #include typedef struct Node { int data; struct Node *LChild; struct Node *RChild; }BiTNode ...
最新文章
- python中package机制的两种实现方式(转载)
- 微博基于Flink的机器学习实践
- Cisco Catalyst 2960系列交换机资料
- java求最大公约数(分解质因数)
- 视觉研究的前世今生(上)王天珍(武汉理工大学)
- mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap...
- Java之读写锁ReadWriteLock实现
- 各种卷积类型Convolution
- Android开发过程中的坑及解决方法收录
- 今天写的一个导出html页面的过程
- 2021-09-03DIEN分成两步去抓取用户的兴趣演化:1兴趣抽取层 去抽取基于用户行为序列的兴趣序列2兴趣演化层 跟target item相关
- 5.13 广东移动 笔试题
- 一个独特的简历生成器,开源了!
- 如何下载微信公众号里面的视频?
- 如何拼局域网所有ip_在windows命令行批量ping局域网内IP
- vs2013设置winp#cap开发环境
- 2015062507 - 星际迷航.红杉
- 由Sensor光电转换效率和光谱功率分布曲线联想到的白平衡增益计算
- 与苹果相反 三星向所有第三方应用开放指纹识别功能
- animaton动画