二叉树建立 - 范文中心

二叉树建立

05/29

二叉树如何建立

先序递归创建二叉树,并对其进行 先序、中序、后序遍历

#include // malloc()等

#include // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等

#include // atoi(),exit()

#include // 数学函数头文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的操作一样

typedef struct BiTNode

{

int data; // 结点的值

BiTNode *lchild,*rchild; // 左右孩子指针

}BiTNode,*BiTree;

int Nil=0; // 设整型以0为空

void visit(int e)

{ 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); // 最后先序遍历右子树

}

}

==============================

#include

#include

#include

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -1

typedef char TElemType;

typedef struct Btn{

TElemType data;

struct Btn *lchild,*rchild;

}BTN ,*BT;

int CreateBT(BT T) {

char ch;

getchar();

printf("\nplease input yuan su:\n"); /*输入二叉树的元素*/

scanf("%c",&ch);

if(ch=='*') T=NULL;

else {

if(!(T=(BTN *)malloc(sizeof(BTN)))) exit(OVERFLOW);

T->data=ch;

CreateBT(T->lchild);

CreateBT(T->rchild);

}

return OK;

} /*创建二叉树*/

int PreOrderT(BT

T )

{

if(T!=NULL) {

printf("%c \n", T -> data);

PreOrderT(T->lchild ) ;

PreOrderT(T->rchild ) ;

}

return OK;

} /*前序遍历二叉树 T:打印每个结点的数据域一次且仅一次*/

int InOrderT(BT T)

{

if (T != NULL) {

InOrderT( T -> lchild ) ;

printf("%c \n", T -> data);

InOrderT( T -> rchild ) ;

}

return OK;

} /*中序遍历二叉树 T:打印每个结点的数据域一次且仅一次*/

int PostOrderT(BT T) {

if (T != NULL) {

PostOrderT( T -> lchild ) ;

PostOrderT( T -> rchild ) ;

printf("%c \n", T -> data);

}

return OK;

} /*后序遍历二叉树 T:打印每个结点的数据域一次且仅一次*/

int BTdepth(BT T)

{

int rd,ld;

if(!T) return 0;

else { ld=BTdepth(T->lchild);

rd=BTdepth(T->rchild);

if(ld>rd) return rd+1;

else return ld+1;

}

} /*编写算法求二叉树T(二叉链表存储结构)的深度。*/

int main(){

BT T

TElemType e;

int Te,j;

while(j){

printf("input gong neng\n"); /*请输入你要的功能*/

printf("-----------\n");

printf("1:xian xu chuang jian shu\n"); /*按前序遍历规则创建二叉树*/

printf("2:xian xu bian li T\n"); /*前序遍历二叉树*/

printf("3:zhong xu bian li T\n"); /*中序遍历二叉树*/

printf("4:hou xu bian li T\n"); /*后序遍历二叉树*/

printf("5:shen du \n"); /*编写算法求二叉树T的深度*/

printf("6:ceng ci bian li \n"); /*按层次遍历二叉树*/

printf("0:exit\n"); /*退出程序*/

printf("-----------\n");

scanf("%d",&j);

switch(j){

case 1:CreateBT(T);break;

case 2:PreOrderT(T);break;

case 3:InOrderT(T);break;

case 4:PostOrderT(T);break;

case 5:BTdepth(T);break;

case 0:exit(1);

}

}

return 0;

}

=================================

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

}


相关内容

  • 主管与经理的两点区别
    酒店知识 主管与经理的两点区别 业务主管的主要职责是,监督员工按照一定的时间一定的质量完成定量的工作,他们向经理汇报工作,是一个监督者的角色.业务主管区别于普通员工,就在于他是一个初级管理者,负责推进一个小团队达成工作业绩. 而经理通常指掌 ...
  • 和谐劳动关系意见修改稿
    中共承德市委办公室 承德市人民政府办公室 关于大力发展和谐劳动关系的意见 2011年7月26日 为进一步发展和谐劳动关系,加强和创新社会管理,构建社会主义和谐社会,顺利完成"十二五"期间各项目标任务,认真贯彻落实&quo ...
  • 住建部20**年-20**年建筑业信息化发展纲要
    住建部2011-2015建筑业信息化发展纲要 深入贯彻落实科学发展观,坚持自主创新.重点跨越.支撑发展.引领未来的方针,高度重视信息化对建筑业发展的推动作用,通过统筹规划.政策导向,进一步加强建筑企业信息化建设. 1 各省.自治区住房和城乡 ...
  • 留守儿童相关制度
    双胜小学留守儿童管理制度 农村留守儿童正处于人生关键时期,由于父母长期不在身边,这些孩子往往感到"情感缺失"."情感饥饿",他们无法享受到父母在思想认识及价值观念上的引导和帮助,成长中缺少了父母情感上 ...
  • 论农村社会保障制度
    论农村社会保障制度(第5页) 论农村社会保障制度 [ 作 者 ]马文兴 [作者简介]马文兴 宁夏人民政府农调队 (银川 750001) [内容提要]随着农村市场经济的发展,建立农村社会保障制度已成为当前社会的客 观要求:因为家庭联产承包责任 ...
  • 企管部工作规划
    企管部工作规划 一. 关于企管部组织架构的建议: 建议企管部部门细化,设置人力资源中心.行政中心和三个部门 ,避免造成公检法不分,缺少监督机制. 二.企管部的意义: 企管部一般细分未人力资源管理.行政管理和总裁办(总经办),其在企业发展中的 ...
  • 年度综治工作创新典型培育计划
    XX镇XXXX年度综治工作创新典型培育计划 一.镇综治专项工作 (一)建立预防青少年学生犯罪警校社"三位一体"共建模式 1.工作目标 为加强在校学生思想道德建设,提高青少年法制意识,贯彻落实<未成年人保护法> ...
  • 关系营销在企业经营中的作用
    关系营销在企业经营中的应用 一.关系营销的涵义 关系营销是由巴巴拉本德 杰克逊1985年提出.关系营销相比较传统的交易营销对企业的发展有着长远的战略意义.我国学者对于关系营销的定义一般是:关系营销是指企业在与其相关利益者之间--如供应商.顾 ...
  • 中华人民共和国计量法(1)
    中华人民共和国计量法(2013年修订) (1985年9月6日第六届全国人民代表大会常务委员会第十二次会议通过1985年9月6日中华人民共和国主席令第二十八号公布自1986年7月1日起施行.2013年12月28日第十二届全国人民代表大会常务委 ...
  • 企业文化与执行力
    一.什么是企业文化: 1.教科书上的概念:企业文化是企业为解决生存和发展的问题的而树立形成的,被组织成员认为有效而共享,并共同遵循的基本信念和认知.企业文化集中体现了一个企业经营管理的核心主张,以及由此产生的组织行为. 2.通俗概念:&qu ...