创建一颗二叉树

创建一颗二叉树
创建一颗二叉树

创建一颗二叉树header.h:

#ifndef BCNF_Header_h

#define BCNF_Header_h

typedefint Item;

typedefstruct node

{

struct node * lchild;

struct node * rchild;

Item data;

}BiTNode,*BiTree;

/*构造一棵新的二叉树*/

BiTree InitBiTree(BiTNode *root);

/*生成节点*/

BiTNode *MakeNode(Item item,BiTNode *lchild,BiTNode *rchild); /*释放节点*/

void FreeNode(BiTNode *pnode);

/*清空一棵二叉树*/

void ClearBiTree(BiTree tree);

/*销毁一棵二叉树*/

void DestroyBiTree(BiTree tree);

/*判定是否为空*/

int IsEmpty(BiTree tree);

/*返回树的深度*/

int GetDepth(BiTree tree);

/*返回根*/

BiTree GetRoot(BiTree tree);

/*返回节点值*/

Item GetItem(BiTNode *pnode);

/*设置节点值*/

void SetItem(BiTNode *pnode,Item item);

/*设置左子树*/

BiTree SetLChild(BiTree parent,BiTree lchild);

/*设置右子树*/

BiTree SetRChild(BiTree parent,BiTree rchild);

/*返回左子树*/

BiTree GetLChild(BiTree tree);

/*返回右子树*/

BiTree GetRChild(BiTree tree);

/*插入新子树*/

BiTree InsertChild(BiTree parent,int lr,BiTree child);

/*删除子树*/

void DeleteChild(BiTree parent,int lr);

/*先序遍历二叉树*/

void PreOrderTraverse(BiTree tree,void(*visit)());

/*中序遍历二叉树*/

void InOrderTraverse(BiTree tree,void(*visit)());

/*后序遍历二叉树*/

void PostOrderTraverse(BiTree tree,void(*visit)());

#endif

main.c:

#include

#include

#include"Header.h"

BiTree InitBiTree(BiTNode *root)

{

BiTree tree = root;

return tree;

}

/*生成节点*/

BiTNode *MakeNode(Item item,BiTNode *lchild,BiTNode *rchild) {

BiTNode * pnode = (BiTNode *)malloc(sizeof(BiTNode));

if(pnode)

{

pnode->data = item;

pnode->lchild = lchild;

pnode->rchild = rchild;

}

return pnode;

}

/*释放节点*/

void FreeNode(BiTNode *pnode)

{

if(pnode!=NULL)

free(pnode);

}

/*清空一棵二叉树*/

void ClearBiTree(BiTree tree)

{

BiTNode * pnode = tree;

if(pnode->lchild!=NULL)

ClearBiTree(pnode->lchild);

if(pnode->rchild!=NULL) ClearBiTree(pnode->rchild);

FreeNode(pnode);

}

/*销毁一棵二叉树*/

void DestroyBiTree(BiTree tree) {

if(tree)

ClearBiTree(tree);

}

/*判定是否为空*/

Item IsEmpty(BiTree tree)

{

if(tree==NULL)

return0;

else

return1;

}

/*返回树的深度*/

int GetDepth(BiTree tree)

{

int cd,ld,rd;

cd = ld = rd = 0;

if(tree)

{

ld = GetDepth(tree->lchild);

rd = GetDepth(tree->rchild);

cd = (ld > rd ? ld : rd); return cd+1;

}

else

return0;

}

/*返回根*/

BiTree GetRoot(BiTree tree)

{

return tree;

}

/*返回节点值*/

Item GetItem(BiTNode *pnode)

{

return pnode->data;

}

/*设置节点值*/

void SetItem(BiTNode *pnode,Item item)

{

pnode->data = item;

}

/*设置左子树*/

BiTree SetLChild(BiTree parent,BiTree lchild) {

parent->lchild = lchild;

return lchild;

}

/*设置右子树*/

BiTree SetRChild(BiTree parent,BiTree rchild) {

parent->rchild = rchild;

return rchild;

}

/*返回左子树*/

BiTree GetLChild(BiTree tree)

{

if(tree)

return tree->lchild;

returnNULL;

}

/*返回右子树*/

BiTree GetRChild(BiTree tree)

{

if(tree)

return tree->rchild;

returnNULL;

}

/*插入新子树*/

BiTree InsertChild(BiTree parent,int lr,BiTree child) {

if(parent)

{

if( lr == 0&& parent->lchild == NULL)

{

parent->lchild = child;

return child;

}

if( lr == 1&& parent->rchild == NULL)

{

parent->rchild = child;

return child;

}

}

returnNULL;

}

/*删除子树*/

void DeleteChild(BiTree parent,int lr)

{

if(parent)

{

if( lr == 0&& parent->lchild != NULL)

{

parent->lchild = NULL;

FreeNode(parent->lchild);

}

if( lr == 1&& parent->rchild != NULL)

{

parent->rchild = NULL;

FreeNode(parent->rchild);

}

}

}

/*先序遍历二叉树*/

void PreOrderTraverse(BiTree tree,void(*visit)()) {

BiTNode * pnode = tree;

if(pnode)

{

visit(pnode->data); PreOrderTraverse(pnode->lchild,visit); PreOrderTraverse(pnode->rchild,visit);

}

}

/*中序遍历二叉树*/

void InOrderTraverse(BiTree tree,void(*visit)()) {

BiTNode * pnode = tree;

if(pnode)

{

InOrderTraverse(pnode->lchild,visit);

visit(pnode->data);

InOrderTraverse(pnode->rchild,visit);

}

}

/*后序遍历二叉树*/

void PostOrderTraverse(BiTree tree,void(*visit)()) {

BiTNode * pnode = tree;

if(pnode)

{

PostOrderTraverse(pnode->lchild,visit); PostOrderTraverse(pnode->rchild,visit);

visit(pnode->data);

}

}

void print(Item item){

printf("%d ",item);

}

int main(int argc, constchar * argv[]) {

BiTNode * n1 = MakeNode(10,NULL,NULL); BiTNode * n2 = MakeNode(20,NULL,NULL); BiTNode * n3 = MakeNode(30,n1,n2); BiTNode * n4 = MakeNode(40,NULL,NULL); BiTNode * n5 = MakeNode(50,NULL,NULL); BiTNode * n6 = MakeNode(60,n4,n5); BiTNode * n7 = MakeNode(70,NULL,NULL);

BiTree tree = InitBiTree(n7);

SetLChild(tree,n3);

SetRChild(tree,n6);

printf("树的深度为:%d",GetDepth(tree));

printf("\n先序遍历如下:"); PreOrderTraverse(tree,print);

printf("\n中序遍历如下:"); InOrderTraverse(tree,print);

printf("\n后序遍历如下:"); PostOrderTraverse(tree,print);

DeleteChild(tree,1);

printf("\n后序遍历如下:"); PostOrderTraverse(tree,print);

DestroyBiTree(tree);

if(IsEmpty(tree))

printf("\n二叉树为空,销毁完毕\n");

return0;

}

二叉排序树的建立及遍历的实现

课程设计任务书 题目: 二叉排序树的建立及遍历的实现 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能: (1)建立二叉排序树; (2)中序遍历二叉排序树并输出排序结果; 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日 排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据 组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。 关键字:排序二叉树,先序遍历,中序遍历,后序遍历 0.引言 我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。 该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归 调用,这将极大的方便算法设计。 1.需求分析 建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。 该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。 2.数据结构设计 本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

二叉树的建立及其应用程序代码

#include #include #include #include typedef char elemtype; typedef struct tree //二叉树结构体 { elemtype data; struct tree *lchild; struct tree *rchild; }TREE; TREE *createbitree() //递归建立二叉树{ char ch; TREE *p; ch=getchar(); if (ch=='#') p=NULL; else { p=(TREE *)malloc(sizeof(TREE)); p->data=ch; p->lchild=createbitree(); p->rchild=createbitree(); } return p; } void preorder(TREE *p) //前序遍历 { if(p!=NULL) { printf("%c ",p->data); preorder(p->lchild); preorder(p->rchild); } } void inorder(TREE *p) //中序遍历 { if (p!=NULL)

{ inorder(p->lchild); printf("%c ",p->data); inorder(p->rchild); } } void postorder(TREE *p) //后序遍历 { if (p!=NULL) { postorder(p->lchild); postorder(p->rchild); printf("%c ",p->data); } } void shu(TREE *p,int len) //数的形状{ if (p!=NULL) { shu(p->lchild,len+1); for (int i=1;i<=4*len;i++) { printf(" "); } printf("%c",p->data); printf("------\n"); shu(p->rchild,len+1); } } int shendu(TREE *p) //计算深度 { int l,r; if (p==NULL) { return 0; } l=shendu(p->lchild)+1; r=shendu(p->rchild)+1; if (l>=r) //左右子树比较return l; else

创建一个二叉树并输出三种遍历结果

实验报告 课程名称数据结构 实验项目实验三--创建一个二叉树并输出三种遍历结果 系别■计算机学院 _________________ 专业_______________ 班级/学号_____________ 学生姓名___________ 实验日期— 成绩______________________________ 指导 教师

实验题目:实验三创建一个二叉树并输出三种遍历结果 实验目的 1)掌握二叉树存储结构; 2)掌握并实现二叉树遍历的递归算法和非递归算法; 3)理解树及森林对二叉树的转换; 4)理解二叉树的应用一哈夫曼编码及WPL计算。 实验内容 1)以广义表或遍历序列形式创建一个二叉树,存储结构自选; 2)输出先序、中序、后序遍历序列; 3)二选一应用题:1)树和森林向二叉树转换;2)哈夫曼编码的应用问题。 题目可替换上述前两项实验内容) 设计与编码 1)程序结构基本设计框架 (提示:请根据所选定题目,描述程序的基本框架,可以用流程图、界面描述图、 框图等来表示) 2)本实验用到的理论知识遍历二叉树,递归和非递归的方法 (应用型

(提示:总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,要求结合自己的题目并阐述自己的理解和想法) 3) 具体算法设计 1) 首先,定义二叉树的存储结构为二叉链表存储,每个元素的数 据类型Elemtype,定义一棵二叉树,只需定义其根指针。 2) 然后以递归的先序遍历方法创建二叉树,函数为CreateTree(),在输 入字符时要注意,当节点的左孩子或者右孩子为空的时候,应当输入一 个特殊的字符(本算法为“ #”),表示左孩子或者右孩子为空。 3) 下一步,创建利用递归方法先序遍历二叉树的函数,函数为 PreOrderTreeQ,创建非递归方法中序遍历二叉树的函数,函数为 InOrderTree(),中序遍历过程是:从二叉树的根节点开始,沿左子树 向下搜索,在搜索过程将所遇到的节点进栈;左子树遍历完毕后,从 栈顶退出栈中的节点并访问;然后再用上述过程遍历右子树,依次类 推,指导整棵二叉树全部访问完毕。创建递归方法后序遍历二叉树的 函数,函数为LaOrderTree()。 (提示:该部分主要是利用C、C++ 等完成数据结构定义、设计算法实现各种操作,可以用列表分步形式的自然语言描述,也可以利用流程图等描述) 4) 编码 #include #include #include typedef char DataType; #define MaxSize 100 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; } *BiTree,BitNode;

二叉树的建立及其遍历实验报告

数据结构实验报告 ———二叉树的建立及其遍历 一、实验目的 1、了解二叉树的建立的方法及其遍历的顺序,熟悉二叉树的三种遍历 2、检验输入的数据是否可以构成一颗二叉树 二、实验的描述和算法 1、实验描述 二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。因为耳熟的每一个左右子树又是一颗二叉树,所以可以用递归的方法来建立其左右子树。二叉树的遍历是一种把二叉树的每一个节点访问完并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句实现。 2、算法 #include #include #define OVERFLOW 0 #define OK 1 #define ERROR 0 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree CreateBiTree(BiTree T)

{ scanf("%c",&e); if(e==' ') T=NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=e; T->lchild=CreateBiTree(T->lchild); T->rchild=CreateBiTree(T->rchild); } return T; } /************************前序遍历***********************/ char PreOrderTraverse(BiTree T,char (* Visit)(char e)) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } char Visit(char e) { printf("%5c",e); return OK; } main() {

C++创建二叉树及操作

#include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef char ElemType; const int MaxLength=30;//结点个数不超过30个 typedef struct BiTreeNode{ ElemType data; struct BiTreeNode *lchild,*rchild; }BiTreeNode,*BiTree; void CreateBiTree(BiTree &T) { ElemType ch; cin>>ch; if(ch=='#') T = NULL;

else { if (!(T = new BiTreeNode)) exit(OVERFLOW); T->data = ch; // 生成根结点 CreateBiTree(T->lchild); // 构造左子树 CreateBiTree(T->rchild); // 构造右子树 } } // CreateBiTree void PreOrder(BiTree &T)//递归函数:先序遍历以T为根的二叉树。 { if(T !=NULL) //递归结束条件 { cout<data<<" ";//访问根结点 PreOrder(T->lchild); //先序遍历根的左子树 PreOrder(T->rchild); //先序遍历根的右子树} }

void InOrder(BiTree &T)//递归函数:中序次序遍历以T为根的子树。 { if(T !=NULL) //NULL是递归终止条件 { InOrder(T->lchild); //中序遍历根的左子树 cout<data<<" "; //访问根结点 InOrder(T->rchild); //中序遍历根的右子树} } void PostOrder(BiTree &T)//递归函数:后序次序遍历以T为根的子树。 { if(T !=NULL) //NULL是递归终止条件 { PostOrder(T->lchild); //后序遍历根的左子树 PostOrder(T->rchild); //后序遍历根的右子树 cout<data<<" "; //访问根结点

二叉树的建立及几种简单的遍历方法

#include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 //栈存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //------二叉树的存储结构表示------// typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //-----顺序栈的存储结构表示------// typedef struct{ BiTree *top; BiTree *base; int stacksize; }SqStack; //*************************************************** //构造一个空栈s SqStack *InitStack(); //创建一颗二叉树 BiTree CreatBiTree(); //判断栈空 int StackEmpty(SqStack *S); //插入元素e为新的栈顶元素 void Push(SqStack *S,BiTree p); //若栈不为空,则删除s栈顶的元素e,将e插入到链表L中void Pop(SqStack *S,BiTree *q); //非递归先序遍历二叉树 void PreOrderTraverse(BiTree L); //非递归中序遍历二叉树 void InOrderTraverse(BiTree L); //非递归后序遍历二叉树 void PostOrderTraverse(BiTree L); //递归后序遍历二叉树 void PostOrder(BiTree bt); //递归中序遍历二叉树 void InOrder(BiTree bt); //递归先序遍历二叉树 void PreOrder(BiTree bt); //***************************************************

数据结构课程设计_线索二叉树的生成及其遍历

数据结构课程设计 题目: 线索二叉树的生成及其遍历 学院: 班级: 学生姓名: 学生学号: 指导教师: 2012 年12月5日

课程设计任务书

摘要 针对以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。 关键词二叉树,中序线索二叉树,中序线索二叉树的遍历

目录 摘要 ............................................ 错误!未定义书签。第一章,需求分析................................. 错误!未定义书签。第二章,概要设计 (1) 第三章,详细设计 (2) 第四章,调试分析 (5) 第五章,用户使用说明 (5) 第六章,测试结果 (5) 第七章,绪论 (6) 第八章,附录参考文献 (7)

线索二叉树的生成及其遍历 第一章需求分析 以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。主要任务: 1.建立二叉树; 2.将二叉树进行中序线索化; 3.编写程序,运行并修改; 4.利用中序线索遍历二叉树 5.书写课程设计论文并将所编写的程序完善。 第二章概要设计 下面是建立中序二叉树的递归算法,其中pre为全局变量。 BiThrNodeType *pre; BiThrTree InOrderThr(BiThrTree T) { /*中序遍历二叉树T,并将其中序线索化,pre为全局变量*/ BiThrTree head; head=(BitThrNodeType *)malloc(sizeof(BiThrType));/*设申请头结点成功*/ head->ltag=0;head->rtag=1;/*建立头结点*/ head->rchild=head;/*右指针回指*/ if(!T)head->lchild=head;/*若二叉树为空,则左指针回指*/ else{head->lchild=T;pre=head; InThreading(T);/*中序遍历进行中序线索化*/ pre->rchild=head; pre->rtag=1;/*最后一个结点线索化*/ head->rchild=pre; }; return head; } void InThreading(BiThrTree p) {/*通过中序遍历进行中序线索化*/ if(p)

简单二叉树的创建,删除,查找

《数据结构》实验报告 姓名: 班级: 学号:

一、算法简介 简单二叉树的创建,删除,查找 二、基本原理 定义节点的结构体,内部成员包括数据data,父节点指针*parent,左子节点指针*lchild,右子结点指针*rchild,以及指针next,然后通过add()和move()函数建立一个二叉树;最后通过del()删除整个二叉树。 三、实现步骤 第一,创建二叉树结点 第二,创建构造二叉树的函数add()和move().在add()中调用move();然后在主函数中初始化二叉树为7个结点(通过建立二叉树的函数)。 创建的二叉树如图: 1 2 3 4 5 6 第三,最后一个个通过查找的方式进行删除结点。该方式不局限于顺序删除,可以

从任何一个结点开始删除,删除后会通过move重新构建,直到删除为止。 四、实验结果如下图 五、结论 本套算法在创建二叉树同时增加了有序检查,通过创建和删除一棵完全二叉树,还可以实现查找结点的功能,未实现遍历、插入、修改、替换等算法,程序较为简单,但是代码工整严谨,时间复杂度和空间复杂度可忽略不计。 六、源程序 #include struct node { int data; struct node *parent; struct node *lchild; struct node *rchild; struct node *next; }*head=NULL; int num=0,b[10];

void move(struct node *p,struct node *s) { while(0) { if(s->data > p->data ) { if(p->rchild==NULL) { p->rchild=s; break; } else { p=p->rchild; } } else { if(p->lchild==NULL) { p->lchild=s; break; } } } } void add(int x) { struct node *s=malloc(sizeof(struct node)),*p=malloc(sizeof(struct node)); s->data=x; s->lchild=NULL; s->rchild=NULL; s->parent=NULL; if(head==NULL) { head=s; } else { p=head; move(p,s); }

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告 篇一:二叉树的建立及遍历实验报告 实验三:二叉树的建立及遍历 【实验目的】 (1)掌握利用先序序列建立二叉树的二叉链表的过程。 (2)掌握二叉树的先序、中序和后序遍历算法。 【实验内容】 1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。 如:输入先序序列abc###de###,则建立如下图所示的二叉树。 并显示其先序序列为:abcde 中序序列为:cbaed 后序序列为:cbeda 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码 5.编译->链接->调试 #include #include #define OK 1 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree &T) { TElemType ch; scanf("%c",&ch); if (ch=='#') T= NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))

创建二叉树的三种算法(递归和非递归)

创建二叉树的三种算法: 1、结构体定义: struct node{ struct node *lchild; struct node *rchild; char ch; }; 2、算法部分 1)递归创建二叉树(无返回值法): void create(struct node **T) { char ch; std::cin>>ch; if( ch == ‘#’) *T = NULL; else { *T = (struct node *)malloc(sizeof(struct node)); *T->ch = ch; create(&(*T)->lchild); create(&(*T)->rchild); } } 搭配上主函数即可使用: int main(void) { struct node *tree; create(&tree); return 0; } 2 ) 递归创建二叉树(有返回值): struct node *create(struct node *T) { char ch; std::cin>>ch; if( ch != ‘#’) { T = (struct node *)malloc(sizeof(struct node)); T->ch = ch; T->lchild = create(T->lchild); T->rchild = create(T->rchild); return T; }

return NULL; } 搭配主函数即可使用: int main(void) { struct node T,*head; head = create(&T); return 0; } 3 ) 非递归创建树: struct node *create() { char ch[20]; int i = 0, flag = 0 ,top = 0; struct node *tree, *head, *stack[20], *st; std::cin>>ch; tree = (struct node *)malloc(sizeof(struct node)); head=tree; tree->data = ch[i]; tree->lchild = NULL; tree->rchild = NULL; stack[top++] = tree; int a = 0; i++; while(irchild == st) { st=stack[--top]; } } else if((ch[i]=='#') && (flag==0)) { flag = 1; } else if(ch[i]!='#') { tree = (struct node *)malloc(sizeof(struct node)); tree->data = ch[i]; tree->lchild = NULL;

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历 #include "stdio.h" #include "string.h" #define NULL 0 typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree Create(BiTree T){ char ch; ch=getchar(); if(ch=='#') T=NULL; else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("Error!"); T->data=ch; T->lchild=Create(T->lchild); T->rchild=Create(T->rchild); } return T;

} void Preorder(BiTree T){ if(T){ printf("%c",T->data); Preorder(T->lchild); Preorder(T->rchild); } } int Sumleaf(BiTree T){ int sum=0,m,n; if(T){ if((!T->lchild)&&(!T->rchild)) sum++; m=Sumleaf(T->lchild); sum+=m; n=Sumleaf(T->rchild); sum+=n; } return sum; } void zhongxu(BiTree T){ if(T){

zhongxu(T->lchild); printf("%c",T->data); zhongxu(T->rchild); } } void houxu(BiTree T){ if(T){ houxu(T->lchild); houxu(T->rchild); printf("%c",T->data); } } int Depth(BiTree T){ int dep=0,depl,depr; if(!T) dep=0; else{ depl=Depth(T->lchild); depr=Depth(T->rchild); dep=1+(depl>depr?depl:depr); } return dep; }

C++创建二叉树及操作

BiTree.h文件 #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef char ElemType; const int MaxLength=30;//结点个数不超过30个 typedef struct BiTreeNode{ ElemType data; struct BiTreeNode *lchild,*rchild; }BiTreeNode,*BiTree; void CreateBiTree(BiTree &T) { ElemType ch; cin>>ch; if(ch=='#') T = NULL;

else { if (!(T = new BiTreeNode)) exit(OVERFLOW); T->data = ch; // 生成根结点 CreateBiTree(T->lchild); // 构造左子树 CreateBiTree(T->rchild); // 构造右子树 } } // CreateBiTree void PreOrder(BiTree &T)//递归函数:先序遍历以T为根的二叉树。 { if(T !=NULL) //递归结束条件 { cout<data<<" ";//访问根结点 PreOrder(T->lchild); //先序遍历根的左子树 PreOrder(T->rchild); //先序遍历根的右子树} }

void InOrder(BiTree &T)//递归函数:中序次序遍历以T为根的子树。 { if(T !=NULL) //NULL是递归终止条件 { InOrder(T->lchild); //中序遍历根的左子树 cout<data<<" "; //访问根结点 InOrder(T->rchild); //中序遍历根的右子树} } void PostOrder(BiTree &T)//递归函数:后序次序遍历以T为根的子树。 { if(T !=NULL) //NULL是递归终止条件 { PostOrder(T->lchild); //后序遍历根的左子树 PostOrder(T->rchild); //后序遍历根的右子树 cout<data<<" "; //访问根结点

C++二叉树的创建与遍历实验报告

二叉树的创建与遍历 一、实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归和非递归方法编写对二叉树这种递归数据结构进行处理的算法。 二、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归和非递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历。 四、实验步骤 源程序代码1 #include #include using namespace std; template struct BinTreeNode //二叉树结点类定义 { T data; //数据域 BinTreeNode *leftChild,*rightChild; //左子女、右子女域 BinTreeNode(T x=T(),BinTreeNode* l =NULL,BinTreeNode* r = NULL ) :data(x),leftChild(l),rightChild(r){} //可选择参数的默认构造函数 }; //------------------------------------------------------------------------- template void PreOrder_2(BinTreeNode *p) //非递归前序遍历 { stack * > S;

数据结构-二叉树的建

数据结构-二叉树的建立与遍历

《数据结构》实验报告 ◎实验题目:二叉树的建立与遍历 ◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法; 2、掌握二叉树的存储结构和非递归遍 历操作的实现方法。 3、提高自己分析问题和解决问题的能 力,在实践中理解教材上的理论。 ◎实验内容:利用链式存储结构建立二叉树,然后先序输出该二叉树的结点序列,在在本实验中不使用递归的方法,而是用一个栈存储结点的指针,以此完成实验要求。 一、需求分析 1、输入的形式和输入值的范围:根据提示,输入二叉树的括号表示形式,按回车结束。 2、输出的形式:输出结果为先序遍历二叉树所得到的结点序列。 3、程序所能达到的功能:输入二叉树后,该程序可以建立二叉树的链式存储结构,之后按照一定的顺序访问结点并输出相应的值,从而完成二叉树的先序遍历。 4、测试数据:

输入二叉树的括号表示形式:A(B(D(,G)),C(E,F)) 先序遍历结果为:ABDGCEF 是否继续?(是,输入1;否,输入0):1 输入二叉树的括号表示形式: 二叉树未建立 是否继续?(是,输入1;否,输入0):0 Press any key to continu e 二概要设计 1、二叉树的链式存储结构是用一个链表来存储一棵二叉树,二叉树中每一个结点用链表中的一个链结点来存储。 每个结点的形式如下图所示。 其中data表示值域,用于存储对应的数据元素,lchild和rchild分别表示左指针域和右指针域,用于分别存储左孩子结点和右孩子结点的存储位置。 2、二叉树的建立

本程序中利用数组存储所输入的二叉树,然后从头到尾扫描数组中的每一个字符根据字符的不同分别执行不同的操作,并用一个存储结点指针的栈辅助完成。在扫描前先申请一个结点作为根结点,也是当前指针所指结点,在二叉树的建立的过程中,每次申请一个新结点,需对其进行初始化,即令lchild域和rchild域为空。按照本程序的思路,二叉树A(B(D(,G)),C(E,F))的链式存储结构如下图所示。二叉树建立的具体过程见详细设计部分。 3、二叉树的先序遍历 在二叉树的先序遍历过程中也需利用一个存储结点指针的栈辅助完成,初始时栈为空,二叉树遍历结束后栈也为空,所以在开始时将头结点入栈,之后根据当前指针所指结点的特性的不同执行不同的操作,以栈空作为二叉树遍历的结束条件。二叉树先序遍历的具体过程见详细设计部分。

按定义definition创建二叉树的说明

操作CreateBiTree(T,definition)的实现 首先要清楚逻辑上怎样唯一地确定二叉树,课堂上讲了3类方法。下面以第一类为例。即带空子树的先序遍历序列。由于实验中二叉链表作为二叉树的物理结构,这样就可以确定CreateBiTree(T,definetion)的说明为 CreateBiTree(BiTree T,ElemType definition[]) 这里BiTree是结点指针类型,definition是数据元素数组,这个数组无法给出数组的大小(像学C语言时,整数序列排序,sort(int a,int n))。这个就要求输入时不要出错。 具体在菜单选择时: case 3: 1. 输入带空子树的先序遍历序列:definition; 2. 调用CreateBiTree(T,definition)。 实现操作CreateBiTree功能,可用多个函数实现。 CreateBiTree(BiTree T,ElemType definition[]){ 。。。。。 调用P131的创建函数CreatBitree1 } CreatBitree1(BiTree T,definition[](第2个参数提供结点数据definition,思考一下具体形式,甚至为了方便取数组元素,设置3个参数都可以)) { 依次输入definition的结点数据ch 根据ch的值,按教材流程处理。 } 以上是假定设计时,规定了按树的定义definition创建二叉树,提供了这个统一的使用方式,使用者按这个统一的接口使用创建操作、创建二叉树。 当然,如果直接按书上的程序,也能实现创建二叉树,也不会影响到后续的其它操作。但是这个调用接口被自行改变了,就显得不规范。

二叉树建立及遍历操作

实验三二叉树建立及遍历操作 一、实验目的 1.熟悉二叉树的存贮结构遍历方式,掌握有关算法的实现。 2.能够利用二叉树解决具体问题。 二、实验环境 1.硬件:每个学生需配备计算机一台。 2.软件:windows操作系统+Turbo C。 三、实验要求 1.要求采用二叉链表作为存贮结构,完成二叉树的建立,先序,中序,后序遍历的操作。其中先序遍历和后序遍历采用递归算法,中序采用非递归算法。 2.输入数据:树中每个结点的数据类型设为零字符型。 四、实验内容 实现如下二叉树处理函数 建立子函数 先序遍历子函数 中序遍历子函数 后序遍历子函数 五、代码如下 #include #include int leafcount=0; typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; int CreateBiTree(BiTree *T){/*根据先序序列建立二叉树的二叉链表*/ char ch; scanf("%c",&ch); if(ch=='-'){ *T=NULL; } else{ if(!(*T=(BiTree)malloc(sizeof(BiTNode )))) return 0; (*T)->data=ch; CreateBiTree(&((*T)->lchild)); CreateBiTree(&((*T)->rchild)); } return 1; } int preOrder(BiTree T){/*先序遍历的递归算法*/ if(T){ printf("%c ",T->data); if (!T->lchild&&!T->rchild) leafcount+=1; preOrder(T->lchild); preOrder(T->rchild); } return 1; } int inOrder(BiTree T){/*中序遍历的递归算法*/ if(T){ inOrder(T->lchild); printf("%c ",T->data); inOrder(T->rchild); } return 1; } int oldOrder(BiTree T){/*后序遍历的递归算法*/ if(T){ oldOrder(T->lchild); oldOrder(T->rchild); printf("%c ",T->data); }

按给定的先序序列来建立二叉树

课程题目:按给定的先序序列来建立二叉树 班级:10计算机2班姓名:熊芸芸学号:10070518 完成日期:12月2日星期五 一、需求分析 1、题目要求 1.1 存储结构: 以二叉链表作为二叉树的存储结构 1.2 二叉树的创建:以给定的先序序列来创建二叉树 1.3 输出二叉树: 以中序和后序序列输出二叉树的结点 2、测试数据: A B $ D G $ $ $ C E $ H $ $ F $ $($表示空格符号) 二、概要设计 ADT BinaryTree { 数据对象D: D是具有相同特性的数据元素的集合。数据关系: R1={ |a i-1,a i ∈D, i=2,...,n } 数据关系 R:若D为空集,则称为空树; 否则:(1) 在D中存在唯一的称为根的数据元素root, (2) 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个子集本身又是一棵树,称为根root的子树。 基本操作: InitStack(SqStack &s) //初始化栈 StackElemty(SqStack &s) //判断栈是否为空 Push(SqStack &s,BiTree e) //将元素e进栈 Pop(SqStack &s,BiTree &e) //出栈,栈顶元素返回给e CreateBiTree(BiTree &t) //用先序建立一个二叉树,空格表示空树 InOrderTraverse(BiTree t,Status(* Visit)(TElemType e))//用非递归方式实现中序遍历,对每个元素调用函数visit PostorderTraverse(BiTree t) //用递归方式实现后序遍历 } ADT BinaryTree 三、详细设计 #include #include typedef int Status; typedef char TElemType; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 50 #define STACKINCREMENT 10 typedef struct BiTNode {//树二叉链表的存储结构 TElemType data; struct BiTNode *lchlid,*rchlid;

利用先序和中序创建二叉树

C++怎么建立一个二叉树?给我代码! 问题补充: 怎么用C++程序表示它 2011-4-2 20:20 最佳答案 根据楼主给出的图,可以用下面的代码来进行构建来构建,代码经过实际的运行验证,无错,运行结果是楼主所给的二叉树。 思想:结合先序和中序遍历来构建给定的二叉树。 所给的二叉树图中,先序:A,B,D,E,C,F,G 中序:D,B,E,A,F,C,G 下面直接贴出代码(建立工程后,贴上下面代码可直接运行): #include "stdafx.h" #include //二叉树结构体 struct BTNode { char data; BTNode *rchild; BTNode *lchild; }; char PreNode[8] ={'A','B','D','F','E','G','H','C'}; char MidNode[8] ={'D','F','B','G','E','H','A','C'}; /* 二叉树创建函数dCreateBranchTree3()<非递归算法> 已知二叉树的前,中序遍历序列串,构造对应的二叉树 <编程思想>: 首先,在前序遍历序列中的首元素是二叉树的根节点,接着 ,在中序遍历序列中找到此节点,那么在此节点以前的节点必为 其左孩子节点,以后的必为其右孩子节点; 然后,在中序遍历序列中,根节点的左子树和右子树再分别 对应子树前序遍历序列的首字符确定子树的根节点,再由中序 遍历序列中根节点的位置分别确定构成它们的左子树和右子树 的节点; 依次类推,确定二叉树的全部节点,构造出二叉树. 参数描述: char *pre: 前序遍历序列 char *mid: 中序遍历序列 int n: 遍历序列中节点个数 返回值: dCreateBranchTree3 = 新建二叉树的根节点指针 */ BTNode *dCreateBranchTree3(char *pre,char *mid,int n) { BTNode *p; char *t; int left;

相关文档
最新文档