算法与数据结构第五章树上机练习
来源:互联网 发布:大数据公司的经营范围 编辑:程序博客网 时间:2024/06/05 16:16
//2.由先缀表达式建立二叉树的二叉链表结构,求该表达式
//对应的后缀,中缀表达式#include <stdio.h>//标准输入输出
#include <malloc.h>//malloc
#include <stdlib.h>//exit()
#include <math.h>//包含了OVERFLOW
typedef struct BinaryTree{
//定义一个二叉树的节点
int data;
BinaryTree *lchild , *rchild;
}BiNode,*BiTree;
void InitBiTree(BiTree &T)//但凡要改变它,都需要将他的地址给它。
{ // 操作结果:构造空二叉树T
T=NULL;
}
int Nil = 0;
void Visit(int n){//还是要有函数指针
//定义一个输出的函数比较好,改起来方便
printf("%d " , n);
}//输出的时候不是输出地址,老大
void CreateTree(BiTree &T){
//创建棵二叉树,按照先序的方法来创建
int number; //创建一个标志位,和一个数据
scanf("%d" , &number);
if (number == 0)
{
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiNode));
if (!T)
{
exit(OVERFLOW);//可能不能生成节点
}
T->data = number;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
void PreOrder(BiTree T,void(*Visit)(int)){
//先序遍历,运用递归后比较容易理解,原来是因为这样子用代码比较容易实现
if (T)
{
Visit(T->data);
PreOrder(T->lchild,Visit);
PreOrder(T->rchild,Visit);
}
}
void InOrder(BiTree T,void(*Visit)(int)){
//中序遍历
if (T)
{
InOrder(T->lchild,Visit);
Visit(T->data);
InOrder(T->rchild,Visit);
}
}
void PostOrder(BiTree T,void(*Visit)(int)){
//后序遍历
if (T){
PostOrder(T->lchild,Visit);
PostOrder(T->rchild,Visit);
Visit(T->data);
}
}
void main(){
//主函数给出各种表达式的写法
BiTree T;
printf("按照先序的方式创建二叉树,0为标志位,代表空,例: 4 2 0 0 5 0 0\n");
InitBiTree(T);
CreateTree(T);
printf("\n先缀表达式:\n");
PreOrder(T,Visit);
printf("\n中缀表达式:\n");
InOrder(T,Visit);
printf("\n后缀表达式:\n");
PostOrder(T,Visit);
}
/*#include<malloc.h> // malloc()等
#include<stdio.h> // 标准输入输出头文件
#include<stdlib.h> // exit()
#include<math.h> // 数学函数头文件
typedef struct BinaryTree
{
int data; // 结点的值
BiTNode *lchild,*rchild; // 左右孩子指针
}BiNode,*BiTree;
int Nil=0; // 设整型以0为空
void visit(int n)
{ printf("%d ",e); // 以整型格式输出
}
void InitBiTree(BiTree &T)
{ // 操作结果:构造空二叉树T
T=NULL;
}
void CreateBiTree(BiTree &T)
{ // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
// 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。修改
int number;
scanf("%d",&number); // 输入结点的值
if(number==Nil) // 结点的值为空
T=NULL;
else // 结点的值不为空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点
if(!T)
exit(OVERFLOW);
T->data=number; // 将值赋给T所指结点
CreateBiTree(T->lchild); // 递归构造左子树
CreateBiTree(T->rchild); // 递归构造右子树
}
}
void DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。操作结果:销毁二叉树T
if(T) // 非空树
{ DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何操作
DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何操作
free(T); // 释放根结点
T=NULL; // 空指针赋0
}
}
void PreOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1
// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ Visit(T->data); // 先访问根结点
PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
}
}
void InOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
{ InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
Visit(T->data); // 再访问根结点
InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
}
}
void PostOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
Visit(T->data); // 最后访问根结点
}
}
void main()
{
BiTree T;
InitBiTree(T); // 初始化二叉树T
printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
CreateBiTree(T); // 建立二叉树T
printf("先序递归遍历二叉树:\n");
PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
printf("\n中序递归遍历二叉树:\n");
InOrderTraverse(T,visit); // 中序递归遍历二叉树T
printf("\n后序递归遍历二叉树:\n");
PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
0 0
- 算法与数据结构第五章树上机练习
- Python宝典第五章:数据结构与算法
- 数据结构与算法-- 第五章 树
- 数据结构与算法练习
- 数据结构与算法练习
- 数据结构与算法 第五课
- 数据结构与算法练习-递归
- 数据结构与算法练习-排序
- 数据结构与算法分析练习
- 数据结构与算法第一章练习
- 数据结构与算法分析课后习题第五章
- 数据结构与算法分析学习笔记--第五章--排序
- 第五章 二叉树 练习题(数据结构与算法MOOC)
- 数据结构与算法JavaScript描述[第五章](队列)
- 数据结构与算法C语言描述 第三章练习
- 算法与数据结构上机练习2
- 《数据结构与算法分析》第一章练习1.1
- 《数据结构与算法分析》第一章练习1.3
- 翻译翻的想吐
- hdu 2102 bfs
- 02_android入门_实现短信/彩信发送的功能
- 别人的博客
- Handler
- 算法与数据结构第五章树上机练习
- Node中的事件轮询(摘自了不起的node.js)
- android 百度地图定位代码参考
- 翻译04
- 给定数量的币值,如25分,10分,5分,1分,编写计算n分的有多少种表示方法
- adb 错误总结
- Unity3d面试+笔试题
- JAVA之矩阵的转置
- 个人与集体