[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
- 按先序序列构造一棵二叉链表表示的二叉树T;
- 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
- 求二叉树的深度/结点数目/叶结点数目;(选做)
- 将二叉树每个结点的左右子树交换位置。(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGEFDBA
层序:ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
[源代码](加注释)
//
// Created by weini on 2019/10/23.
//
#include <cstdio>
typedef struct Node{
char data;
struct Node *LChild,*RChild;
}*BiTree,TNode;
typedef struct Queue{
TNode *base;
int front;
int rear;
}TreeQueue;
void InitTree(BiTree &T){
//先序创建
char ch;
scanf("%c",&ch);
if(ch=='#'){
T=nullptr;
}
else{
T=new TNode;
T->data=ch;
InitTree(T->LChild);
InitTree(T->RChild);
}
}
void XianTravel(BiTree &T){
//先序遍历
if(T){
printf("%c ",T->data);
XianTravel(T->LChild);
XianTravel(T->RChild);
}
}
void ZhongTravel(BiTree &T){
//中序遍历
if(T){
ZhongTravel(T->LChild);
printf("%c ",T->data);
ZhongTravel(T->RChild);
}
}
void HouTravel(BiTree &T){
//后序遍历
if(T){
HouTravel(T->LChild);
HouTravel(T->RChild);
printf("%c ",T->data);
}
}
void InitQueue(Queue &q){
q.base=new TNode[1000];
if(!q.base)return;
q.front=q.rear=0;
}
void Enter(Queue &q,BiTree &T){
q.base[q.rear]=*T;
q.rear++;
}
void Out(Queue &q){
TNode item=q.base[q.front];
q.front++;
}
void CengTravel(BiTree &T){
TreeQueue q;
InitQueue(q);
TNode front;
if(!T){
return;
}
Enter(q,T);//根节点入队
while(q.rear!=q.front){
front=q.base[q.front];
Out(q);
if(front.LChild){//若有左孩子,左孩子入队
Enter(q,front.LChild);
}
if(front.RChild){
Enter(q,front.RChild);
}
printf("%c ",front.data);
}
}
int Depth(BiTree &T){
if(!T){
return 0;
}
else{
int m=Depth(T->LChild);
int n=Depth(T->RChild);
if(m>n){
return m+1;
}
else{
return n+1;
}
}
}
int NodeCount(BiTree &T){
if(!T)return 0;
else return NodeCount(T->LChild)+NodeCount(T->RChild)+1;
}
int LeaveCount(BiTree &T){
if(!T)return 0;
if(!T->RChild&&!T->LChild)return 1;//终止条件:当递归到叶子时;
else
return LeaveCount(T->LChild)+LeaveCount(T->RChild);
}
int main(){
BiTree T;
printf("输入节点:");
InitTree(T);
printf("先序遍历: ");
XianTravel(T);
printf("\n");
printf("中序遍历: ");
ZhongTravel(T);
printf("\n");
printf("后序遍历: ");
HouTravel(T);
printf("\n");
printf("层序遍历: ");
CengTravel(T);
printf("\n此树的深度为: %d",Depth(T));
printf("\n结点个数为: %d",NodeCount(T));
printf("\n叶子结点个数为: %d",LeaveCount(T));
return 0;
}
运行结果如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024224325901.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA4NDYwMw==,size_16,color_FFFFFF,t_70)