【无标题】

#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; 

  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值