#include"stdio.h"
#include"string.h"
#include<stdlib.h>
#include<malloc.h>
//#include<system>
#define Max 20 /*结点的最大个数*/
typedef struct node{
  char data;
  struct node *lchild,*rchild;
}BinTNode; /*自定义二叉树的结点类型*/
typedef BinTNode *BinTree; /*定义二叉树的指针*/
int NodeNum,leaf; /*NodeNum为结点数,leaf为叶子数*/
/*==========基于先序遍历算法创建二叉树============== */
/*=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== */
BinTree CreatBinTree(void)
{
  BinTree T;
  char ch;
  if((ch=getchar())=='#')
  return(NULL); /*读入#,返回空指针 */
  else{  
  T=(BinTNode *)malloc(sizeof(BinTNode)); /*生成结点*/
  T->data=ch;
  T->lchild=CreatBinTree(); /*构造左子树*/
  T->rchild=CreatBinTree(); /*构造右子树*/
  return(T);
  }
}
/*========NLR 先序遍历============= */
void Preorder(BinTree T)
{
  if(T) {
  printf("%c",T->data); /*访问结点*/
  Preorder(T->lchild); /*先序遍历左子树*/
  Preorder(T->rchild); /*先序遍历右子树*/
  }
}

/*========LNR 中序遍历===============*/
/*==============中序遍历================== */
void Inorder(BinTree T)
{
  if(T) {
  Inorder(T->lchild); /*中序遍历左子树*/
  printf("%c",T->data); /*访问结点*/
  Inorder(T->rchild); /*中序遍历右子树*/
  }
}

/*==========LRN 后序遍历============ */
/*==============后序遍历===================*/
void Postorder(BinTree T)
{
  if(T) {
   
  Postorder(T->lchild); /*后序遍历左子树*/
  Postorder(T->rchild); /*后序遍历右子树*/
printf("%c",T->data); /*访问结点*/
  }
}

/*=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法======== */
int TreeDepth(BinTree T)
{
  int hl,hr,max;
  if(T){
  hl=TreeDepth(T->lchild); /*求左深度*/
  hr=TreeDepth(T->rchild); /*求右深度*/
  max=hl>hr? hl:hr; /*取左右深度的最大值*/
  NodeNum=NodeNum+1; /*求结点数*/
  if(hl==0&&hr==0) leaf=leaf+1; /*若左右深度为0,即为叶子。*/
  return(max+1);
  }
  else return(0);
}
/*====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========*/
void Levelorder(BinTree T)
{
  int front=0,rear=1;
  BinTNode *cq[Max],*p; /*定义结点的指针数组cq */
  cq[1]=T; /*根入队*/
  while(front!=rear)
  {
  front=(front+1)%NodeNum;
  p=cq[front]; /*出队 */
  printf("%c",p->data); /*出队,输出结点的值 */
  if(p->lchild!=NULL){
  rear=(rear+1)%NodeNum;
  cq[rear]=p->lchild; /*左子树入队 ( 指针替换)*/
  }
  if(p->rchild!=NULL){
  rear=(rear+1)%NodeNum;
  cq[rear]=p->rchild; /*右子树入队*/
  }
  }
}
/*==========主函数=================*/
void main()
{
  BinTree root;
  int i,depth;
  printf("\n");
printf("Creat Bin_Tree; Input preorder:"); /*输入完全二叉树的先序序列,*/
  /* 用#代表虚结点,如ABD###CE##F## */
  root=CreatBinTree(); /*创建二叉树,返回根结点*/
  do { /*从菜单中选择遍历方式,输入序号。*/
  printf("\t********** select ************\n");
  printf("\t1: Preorder Traversal\n");  
  printf("\t2: Iorder Traversal\n");
  printf("\t3: Postorder traversal\n");
  printf("\t4: PostTreeDepth,Node number,Leaf number\n");
  printf("\t5: Level Depth\n"); /*按层次遍历之前,先选择4,求出该树的结点数*/
  printf("\t0: Exit\n");
  printf("\t*******************************\n");
  scanf("%d",&i); /*输入菜单序号(0-5) */
  switch (i){
  case 1: printf("Print Bin_tree Preorder: ");
  Preorder(root); /*先序遍历 */
  break;
  case 2: printf("Print Bin_Tree Inorder: ");
  Inorder(root); /*中序遍历*/
  break;
  case 3: printf("Print Bin_Tree Postorder: ");
  Postorder(root); /*后序遍历*/
  break;
  case 4: depth=TreeDepth(root); /*求树的深度及叶子数*/
  printf("BinTree Depth=%d BinTree Node number=%d",depth,NodeNum);
  printf(" BinTree Leaf number=%d",leaf);
  break;
  case 5: printf("LevePrint Bin_Tree: ");
  Levelorder(root); /*按层次遍历 */
  break;
  default: exit(1);
  }
  printf("\n");
  } while(i!=0);
}

转载于:https://www.cnblogs.com/this-543273659/archive/2011/07/28/2119363.html

二叉树的创建及各种遍历相关推荐

  1. 二叉树的创建、前序遍历、中序遍历、后序遍历

    二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /*  作者:成晓旭 ...

  2. 【数据结构】——二叉树的创建、计算叶子结点个数、递归遍历

    前面我们讲了关于数据结构中的堆栈问题,这篇文章主要是为大家简要介绍一下二叉树,并实现二叉树的创建.计算叶子结点个数.递归遍历.判断是否是完全二叉树等相关问题~ 一.二叉树的介绍 1.什么是二叉树 一棵 ...

  3. 二叉树的创建和遍历实现

    1 前言 提到**树(Tree)**结构,很容易联想到"大树",想到这是"一对多关系"特性的数据结构,其相关的名词.概念很多: 子树(SubTree).结点(N ...

  4. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  5. 二叉树的操作(二叉树的创建、先序遍历---先根、中序遍历----先左、后续遍历---后根)

    #include "stdlib.h" #include "stdio.h" #include "Windows.h" #include & ...

  6. 二叉树的创建和遍历-C语言实现

    二叉树的创建和遍历-C语言实现 链式存储结构 struct BinaryTreeNode {//数据char data;//左子树BinaryTreeNode *leftChild;//右子树Bina ...

  7. c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)

    C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...

  8. python二叉树的创建与遍历

    二叉树的基本概念: 一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推 二叉树的深度(高度):指的是二叉树中的最大叶子结点所在的层.二叉树的深度 ...

  9. 二叉树的创建_大多数人都不会手写创建并遍历二叉树,一航这里帮你终结了

    创建二叉树.遍历二叉树.二叉树的最近公共祖先任何疑问.意见.建议请公众号留言或联系qq474356284先序.后序创建二叉树先中后层序遍历二叉树二叉树的最近公共祖先 输入格式: 创建二叉树时的输入: ...

最新文章

  1. 关于struts1的配置
  2. 杭州 3~5年 前端面经,高频面试题总结
  3. Bailian1183 POJ1183 反正切函数的应用【迭代计算】
  4. [转]理解事件捕获和事件冒泡
  5. dubbo实现两个系统之间的通信
  6. 漏洞复现|Microsoft Office数学公式编辑器内存损坏漏洞(CVE-2017-11882 )
  7. 使用BoundsChecker检测内存泄漏
  8. 三极管开关电路_利用三极管设计开关电路
  9. 计算日期在当月是第几周-【自然周(每月第一个周一为该月第一周)做法以及1号为第一周做法】
  10. gsm在linux下工作原理,GSM模块详解 从工作原理到应用案例
  11. 阿里云数据库(RDS)是什么,与传统数据库有什么区别?
  12. 如何获取注册高德Key使用的SHA1值
  13. Android 通知栏图标
  14. 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
  15. 中国“互联网+”大学生创新创业大赛“的实施方案及评审规则
  16. C++多项式除法的探讨
  17. js序列化与反序列化和C#中json序列化与反序列化
  18. DockOne微信分享(九十九):海航生态科技舆情大数据平台容器化改造
  19. matlab计算表面粗糙度,基于MATLAB图像处理的铸造表面粗糙度测量方法
  20. prt文件用什么软件打开(免费手机prt文件浏览器)

热门文章

  1. PyCharm中导入数据分析库
  2. 数据结构c字符串操作语言版本
  3. SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句
  4. 3月11日Linux课程笔记
  5. pad点餐系统 内存管理的一点总结
  6. 有关视图状态(ViewState)的一些问题
  7. 2020 年开源项目
  8. 【数据结构与算法】完结
  9. 现代化多媒体教室的计算机系统,多媒体教室系统建设方案
  10. 创建系统镜像_学会这些, 操作docker image镜像就够了!