#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef char DataType;
int depth=0;
int h1=1;
int nlayer=1;
char ch2;
typedef struct node
{DataType data;//节点数据元素struct node *lchild;//指向左孩子struct node *rchild;//指向右孩子
}BinTNode,*BinTree;
void GetPreOrder(char *last,char *mid,BinTree &T,int len)
{//利用后序和中序建立二叉树if(len==0){T = NULL;return;} //取出后序序列中的最后一个节点char ch=last[len-1];int index=0;  //在中序序列中进行查找根节点,并用index记录其在序列中的索引while(mid[index]!=ch){index++;} T=(BinTree)malloc(sizeof(BinTNode)); //给根节点分配空间T->data=mid[index];  GetPreOrder(last,mid,T->lchild,index);//建立左子树  GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);//建立右子树
}
void GetPostOrder(char *prim,char *mid,BinTree &T,int len)
{//利用先序和中序建立二叉树if(len==0){T=NULL;return;}  char ch=prim[0];//提出先序序列中的第一个节点int index=0;  while(mid[index]!=ch){//在中序序列中查找当前根节点。并用index记录其在序列中的位置index++;}  //给根节点分配空间T=(BinTree)malloc(sizeof(BinTNode));T->data=mid[index];  GetPostOrder(prim+1,mid,T->lchild,index); //建立左子树 GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);//建立右子树
}
void createB(BinTree &T)
{//扩展先序遍历创建二叉链表DataType ch;scanf("%c",&ch);if(ch=='.')T=NULL;else{T=(BinTNode *)malloc(sizeof(BinTNode));T->data=ch;createB(T->lchild);createB(T->rchild);}
}
void gradeBT(BinTree &T,DataType ch,int d,int *n)
{/*求ch结点所在层数*/if (T)  {d++;if(T->data==ch)*n=d;gradeBT(T->lchild,ch,d,n);gradeBT(T->rchild,ch,d,n);}
}
void countdef(BinTree T,int &n)
{  /*统计叶子结点数*/if(T!=NULL){if(T->lchild==NULL&&T->rchild==NULL)n++;countdef(T->lchild,n);countdef(T->rchild,n);}
}
int depthhou(BinTree bt)
{//后序遍历求二叉树的高度int hl,hr,max;if(bt!=NULL){hl=depthhou(bt->lchild);hr=depthhou(bt->rchild);max=hl>hr?

hl:hr; return (max+1); } else return 0; } void depthxian(BinTree bt,int h1) {//先序遍历求二叉树高度 if(bt!=NULL) { if(h1>depth) depth=h1; depthxian(bt->lchild,h1+1); depthxian(bt->rchild,h1+1); } } void PrintTree(BinTree bt,int nlayer) {//树状打印二叉树 if(bt==NULL) return; PrintTree(bt->rchild,nlayer+1); for(int i=0;i<nlayer;i++) printf(" "); printf("%c\n",bt->data); PrintTree(bt->lchild,nlayer+1); } void Inorderxian(BinTree &T) {//先序输出二叉树 if(T!=NULL) { printf("%3c",T->data); Inorderxian(T->lchild); Inorderxian(T->rchild); } } void Inorderzhong(BinTree &T) {//中序输出二叉树 if(T!=NULL) { Inorderzhong(T->lchild); printf("%3c",T->data); Inorderzhong(T->rchild); } } void Inorderhou(BinTree &T) {//后序输出二叉树 if(T!=NULL) { Inorderhou(T->lchild); Inorderhou(T->rchild); printf("%3c",T->data); } } void main() { DataType ch; BinTree root; BinTree T=NULL; BinTree BT=NULL; int d=0,h=0,l=1,n=0; int x,count2=0,count3=0; DataType first[26],mid[26],last[26]; root=(BinTNode *)malloc(sizeof(BinTNode)); printf("*****************************************************************\n"); printf("* 1、扩展先序遍历创建二叉树 2、统计二叉树叶子结点数 *\n"); printf("* 3、先序遍历求二叉树高度 4、后序遍历求二叉树高度 *\n"); printf("* 5、按树状打印二叉树 7、利用先序和中序创建二叉树 *\n"); printf("* 8、利用后序和中序创建二叉树 9、先序输出二叉树 *\n"); printf("* 10、中序输出二叉树 11、后序输出二叉树 *\n"); printf("*****************************************************************\n"); printf("请输入你的选择:\n"); //第一种方法创建二叉树 printf("请依照先序遍历的顺序输入须要中序遍历的字符:\n"); createB(root); printf("先序遍历输入二叉树例如以下:"); Inorderxian(root); printf("\n"); printf("中序遍历输入二叉树例如以下:"); Inorderzhong(root); printf("\n"); printf("后序遍历输入二叉树例如以下:"); Inorderhou(root); printf("\n\n"); printf("统计二叉树叶子数:"); countdef(root,n); printf("count=%d\n",n); printf("先序遍历输出二叉树的高度:"); depthxian(root,h1); printf("depthxain=%d\n",depth); printf("后序遍历输出二叉树的高度:"); printf("depthhou=%d\n",depthhou(root)); printf("打印输出二叉树的树状结构:\n"); PrintTree(root,1); //另外一种方法创建二叉树 printf("请输入先序和中序序列:\n"); scanf("%s%s",first,mid); GetPostOrder(first,mid,T, strlen(first)); printf("打印输出二叉树的树状结构:\n"); PrintTree(root,1); printf("先序遍历输入二叉树例如以下:"); Inorderxian(T); printf("\n"); printf("中序遍历输入二叉树例如以下:"); Inorderzhong(T); printf("\n"); printf("后序遍历输入二叉树例如以下:"); Inorderhou(T); printf("\n"); printf("统计二叉树叶子数:"); countdef(T,count2); printf("count2=%d\n",count2); printf("先序遍历输出二叉树的高度:"); depthxian(T,h1); printf("depthxain=%d\n",depth); printf("后序遍历输出二叉树的高度:"); printf("depthhou=%d\n",depthhou(T)); //第三种方法创建二叉树 printf("请输入后序和中序序列:\n"); scanf("%s%s",last,mid); GetPreOrder(last,mid,BT,strlen(last)); printf("打印输出二叉树的树状结构:\n"); PrintTree(BT,1); printf("先序遍历输入二叉树例如以下:"); Inorderxian(BT); printf("\n"); printf("中序遍历输入二叉树例如以下:"); Inorderzhong(BT); printf("\n"); printf("后序遍历输入二叉树例如以下:"); Inorderhou(BT); printf("\n"); printf("统计二叉树叶子数:"); countdef(BT,count3); printf("count3=%d\n",count3); printf("先序遍历输出二叉树的高度:"); depthxian(BT,h1); printf("depthxain=%d\n",depth); printf("后序遍历输出二叉树的高度:"); printf("depthhou=%d\n",depthhou(BT)); printf("\n"); printf("\n"); }

二叉树的基本操作及应用(三)相关推荐

  1. 二叉树的基本操作——数据结构实验报告

    一.实验名称:二叉树 二.实验目的 1)熟练掌握二叉树的存储方式的具体实现过程,实现二叉树的基本操作及运算: 2)进一步巩固指针的用法,栈及队列的基本操作,进一步体会递归算法,学会综合应用. 三.实验 ...

  2. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  3. 二叉树的基本操作(c语言)

    二叉树的基本操作 创建二叉树 二叉树的叶子节点 二叉树的节点总数 二叉树的高度 二叉树的基本遍历方法 创建二叉树 代码: // 创建二叉树,使用# void createBiTree(BiTree&a ...

  4. 二叉树的基本操作之二叉排序树

    //二叉树的基本操作之-建立二叉排序树并遍历 #include<stdio.h> #include<string.h> struct Node{Node *lchild;Nod ...

  5. 二叉树的基本操作及哈夫曼编码/译码系统的实现

    二叉树的基本操作及哈夫曼编码/译码系统的实现 实验目的和要求 掌握二叉树的二叉链表存储表示及遍历操作实现方法. 实现二叉树遍历运算的应用:求二叉树中叶结点个数.结点总数.二叉树的高度,交换二叉树的左右 ...

  6. 非递归遍历二叉树(算法导论第三版第十章10.4-5)

    非递归遍历二叉树(算法导论第三版第十章10.4-5) template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTree ...

  7. 树的基本操作代码 c语言,二叉树的基本操作(C语言、源代码)

    二叉树的基本操作(源代码) #include "stdio.h" #include "malloc.h" #define MAX 100 typedef str ...

  8. 手写二叉树的基本操作

    本题题目来源是: https://pta.patest.cn/pta/test/1342/exam/3/question/20490 老实说,写二叉树的基本操作写的我心慌意乱,主要原因是总感觉递归学的 ...

  9. 实现二叉树的基本操作(Java版)

    近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码: package com.sf.test;import java.util.ArrayDeque; import ...

  10. 数据结构实验 二叉树的基本操作

    数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...

最新文章

  1. m行n列最大值和最小值C语言,找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数...
  2. 一个项目搞定支付宝,微信支付!
  3. WebKit Page对象的分析
  4. java基础-注解Annotation原理和用法
  5. Windows上Tomcat启动,服务中没有Tomcat
  6. 后端开发:数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!...
  7. java窗体线条切换消失_java – 如何更改apache poi生成的图表不使用平滑线条并将空单元格显示为间隙?...
  8. OpenResty入门
  9. 都昌时间轴控件功能说明
  10. 企业为开源做贡献,贡献大了说话就有人听了
  11. CTU CU CB PU TU
  12. Alphapose_pytorch版本环境配置Win10
  13. 中国语言地图集 c1-12,中国语言地图集介绍——网上收集整理
  14. 初识爬虫,爬虫原理?爬虫是什么?为什么爬虫用python比较流行?
  15. 电线可以用一样颜色的吗
  16. 扁平化数据处理成tree树形结构
  17. qq申诉网站无法接到服务器,为什么我qq申诉不成功 - 卡饭网
  18. 一文理解UART通信
  19. 用PHPExcel读取excel文件内容
  20. wo de wen jian

热门文章

  1. 成对的歌曲,其总持续时间可被60整除
  2. Visual Studio进行linux远程开发
  3. python计数器函数_Python计数器Counter
  4. powerbi的功能介绍_Power BI:1分钟快速生成可视化报表
  5. c++ 中extern C 及#ifdef __cplusplus的作用
  6. yum 安装 sun java,CentOS yum安装sun Java jre jdk和openjdk
  7. Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式
  8. Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计
  9. php显示时间,php实现用已经过去多长时间的方式显示时间
  10. C——通过调用函数分配内存