#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//#include <iostream>
//using namespace std;
//二叉树结构
typedef struct BNode{
char data;
struct BNode *lchild;
struct BNode *rchild;
}BTreeNode,*BTree;
//队列结构
typedef struct QNode{
BNode data;
struct QNode *next;
}QNode,*QueueNode;
typedef struct{
QueueNode front;//队头指针
QueueNode rear;//队尾指针
}LinkQueue;
//初始化
void InitTree(BTree &T){
// T->data="#";
// T->lchild=NULL;
// T->rchild=NULL;
T=NULL;
}
//建立二叉链表储结构(基于先序)
void CreatTree(BTree &T){
char c;
scanf("%c",&c);
// if(c=="#"){
// T=NULL;
// }
// else{
//
// T->data=c;//为结点赋值
// CreatTree(T->lchild);//递归创建左子树
// CreatTree(T->rchild);//递归创建右子树
// }
T->data=c;//为结点赋值
CreatTree(T->lchild);//递归创建左子树
CreatTree(T->rchild);//递归创建右子树
}
//判断二叉树是否为空
bool IsEmptyTree(BTree T){
// if(T==NULL || T->data=="#"){
// return true;
// }
if(T==NULL){
return true;
}
else{
return false;
}
}
//先序遍历
void PreOrder(BTree T){
if(T!=NULL){
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BTree T){
if(T!=NULL){
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
}
//先序遍历二叉树(非递归)
//队列初始化
int InitQueue(LinkQueue &Q){
Q.front=new QNode;
if(Q.front==NULL)
{
return 0;
}
Q.front->next=NULL;
Q.rear=Q.front;
printf("初始化队列成功!\n");
return 1;
}
//判断队列是否为空
bool IsEmptyQueue(LinkQueue &Q){
if(Q.front==Q.rear){
return true;//队列空
}
else{
return false;
}
}
//入队
int EnQueue(LinkQueue &Q,BNode x){
QueueNode s=new QNode;
if(s==NULL){
return 0;
}
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
return 1;
}
//出队
int DeQueue(LinkQueue &Q,BNode &x){
QueueNode p;
if(Q.front==Q.rear){
return 0;//队列空
}
p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p){
Q.rear=Q.front;
}
delete p;
return 1;
}
//队列实现二叉树的层次遍历
void levelOrder(BTree T){
LinkQueue Q;
InitQueue(Q);//初始化辅助队列
BTree M;
EnQueue(Q,T);//将根结点入队
while(!IsEmptyQueue(Q)){//队列不空则循环
DeQueue(Q,M);//对头结点出队
printf("%c ",M->data);//打印出队结点
if(M->lchild!=NULL){
EnQueue(Q,M->lchild);//左孩子入队
}
if(M->rchild!=NULL){
EnQueue(Q,M->rchild);//右孩子入队
}
}//重复,直到队列为空
}
//二叉树的高度
int DepthTree(BTree T){//二叉树的高度就是左子树和右子树的最大高度+1就是二叉树的高度
int ldepth,rdepth;
if(T==NULL){
return 0;
}
else{
ldepth=DepthTree(T->lchild);
rdepth=DepthTree(T->rchild);
return max(ldepth+1,rdepth+1);
}
}
//二叉树叶子结点个数
int CountLeaf(BTree T){
int n=0;
if(T==NULL){
return 0;
}
else{
if(T->lchild==NULL && T->rchild==NULL){//当某一结点的左子树和右子树都为空时,那么这个结点就为叶子节点
return n+=1;
}
else{
CountLeaf(T->lchild);
CountLeaf(T->rchild);
}
return n;
}
}
//二叉树表现为树或森林的孩子兄弟链表,计算叶子结点的个数
int main(){
BTree T;
InitTree(T);
printf("------二叉树演示系统-------\n");
printf("-----------------------------------------------------------------\n");
printf("请输入你想进行的操作:\n");
printf("1:根据输入的序列,建立二叉链表存储节构\n");
printf("2:输出二叉树的先序遍历结果\n");
printf("3:输出二叉树的中序遍历结果\n");
printf("4:输出二叉树的后序遍历结果\n");
printf("5:先序遍历二叉树(非递归算法)\n");
printf("6:借助队列实现二叉树的层次遍历\n");
printf("7:求二叉树的高度\n");
printf("8:求二叉树叶子结点个数\n");
printf("9:将二叉链表视为树或森林的孩子兄弟链表,计算其叶子结点的深度\n");
int choose;
while(scanf("%d",choose),choose){
switch(choose){
case 1:
CreatTree(T);
break;
case 2:
PreOrder(T);
break;
case 3:
InOrder(T);
break;
case 4:
PostOrder(T);
break;
case 5:
levelOrder(T);
break;
case 6:
levelOrder(T);
break;
case 7:
DepthTree(T);
break;
case 8:
CountLeaf(T);
break;
case 9:
break;
}