您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构第五章树上机练习

2014-05-21 20:51 726 查看
//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: