数据结构课程设计报告-二叉树根节点到指定节点的路径

合集下载

二叉树《数据结构》课程设计报告-目录及正文

二叉树《数据结构》课程设计报告-目录及正文

目录1 前言 (1)2 需求分析 (1)2.1课程设计目的 (1)2.2课程设计任务 (1)2.3设计环境 (1)3 概要设计 (1)3.1数据结构设计 (2)3.2模块设计 (3)4详细设计 (3)5 测试分析 (13)6 课程设计总结 (18)参考文献 (19)致谢 (19)1 前言编写一个程序来处理二叉树的存储及各种非递归遍历输出。

实现二叉树的广义表表示法输出二叉树,二叉树的先序、中序、后序以及层次遍历。

通过栈、队列来实现。

针对现实世界中如今许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象,如人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。

2 需求分析2.1课程设计目的学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。

通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。

2.2课程设计任务先序、中序、后序及层次遍历的非递归遍历算法的实现,应包含建树的实现。

2.3设计环境(1)WINDOWS 2000/2003/XP/7/Vista系统(2)Visual C++或TC集成开发环境3 概要设计通过一个二叉链表对二叉树存储,其中每个结点包括左孩子指针、右孩子指针和双亲结点表示值。

通过一个顺序栈对二叉树先中序遍历的结点存储,其中包括一个下标指针和二叉树结点数组。

通过一个顺序栈对二树后序遍历的结点存储,其中包括一个下标指针和二叉树结点和值的数组。

通过一个顺序队列对二叉树层次遍历的结点存储,其中包括头尾指针和一个结点。

数据结构课程设计报告-二叉树根节点到指定节点的路径

数据结构课程设计报告-二叉树根节点到指定节点的路径

数据结构课程设计报告-二叉树根节点到指定节点的路径数据结构课程设计报告二叉树根节点到指定节点的路径——递归调用思想班级:__ 软件092________ 姓名:_ __________ 指导教师:__ 成绩:___________________ 信息工程学院2011 年 6 月17 日- 2 - 摘要(题目): 二叉树根节点到指定节点的路径 1.引言二叉树是n 个结点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件;(1)有且仅有一个称为根的结点;(2)其余结点分为两个互不相交的集合T1,T2,并且T1,T2,都是二叉树,分别称为根的左子树和右子树。

二叉树形结构在客观世界中大量存在,如行政组织机构和人类社会的家谱关系等都可用二叉树结构形象地表示。

在计算机应用领域,二叉树也被广泛地应用。

例如在编译程序中,可用二叉树来表示源程序的语法结构;在数据库系统中,可用二叉树来表示组织信息;在计算机图形学中,可用二叉树来表示图像关系等。

因此对二叉树的研究具有重要意义。

2.需求分析利用一个简单的菜单,通过菜单项进行选择,实现和完成如下功能:用先序输入,建立二叉树存储结构、求指定结点的路径。

对于建立二叉树存储结构,考虑到栈和队列的存储结构比较繁琐,从而定义一指针数组来一一存储该二叉树先序遍历过的结点,并对该结点进行判断是否为指定的目标结点,并进行输出等操作。

3.概要设计对二叉树采用链式存储结构,其结构定义如下:typedef structnode{ DataType data; struct node*lchild,*rchild; }BinTNode,*BinTree; 每个结点中设置三个域,即值域data,左指针域*lchild 和右指针域*rchild。

本程序分为6 大模块:全局变量定义、创建结构体、创建二叉链表存储表示、查找目标结点、求结点路径、主函数。

(1)全局变量定义(2)创建结构体(3)创建二叉链表存储表示:定义二叉树的链式存储结构,输入数据生成二叉树。

数据结构课程设计报告-二叉树

数据结构课程设计报告-二叉树

数据结构课程设计报告-二叉树湖南涉外经济学院课程设计报告课程名称:数据结构报告题目:二叉树的基本操作学生姓名:肖琳桂、康政、张小东、张帆所在学院:信息科学与工程学院专业班级:软工本1402学生学号: 144300211、02、14、08 指导教师:李春庭摘要本课程设计主要说明如何在C++编程环境下实现二叉树的遍历,遍历方式包括:二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。

同时,此次课程设计还包括了求二叉树深度和结点个数,结点的孩子信息,以及对文件的操作,用文件读取的方式实现对二叉树的建立。

以通过此次课程设计,使学生充分掌握树的基本操作,以及对线性存储结构的理解。

同时,在对树的遍历的操作过程中,同样是运用递归的方式实现遍历,在对树实现层次操作的时候,要求用循环队列的操作方式来实现层次遍历。

此次课程设计对数据结构内容综合性的运用的要求较高。

关键词:二叉树,先序遍历,中序遍历,后序遍历,层次遍历,节点,线性存储, 节点的孩子信息目录课程设计任务书.................................... 错误!未定义书签。

一、需求分析 (6)1.问题描述 (6)2.功能要求 (6)二、概要设计 (7)1.总体设计图 (7)2.数据结构设计 (8)3.算法设计 (8)4.主要模块及模块之间的关系 (8)三、详细设计 (8)1.结构体(或类)设计 (8)2. 主要模块实现的流程图 (9)3.算法设计 (10)四、测试运行 (12)1.登录和主界面运行效果图 (12)2.运行说明 (12)3. 运行效果图 (13)五、结论与心得 (15)1.总体评价 (15)2.所做的工作及体会 (15)六、程序附录(源代码) (19)七、参考文献 (30)一、需求分析1.问题描述设计一个二叉树。

二叉树形象地说即树中每个节点最多只有两个分支,它是一种重要的数据类型。

可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表等。

数据结构二叉树的实验报告

数据结构二叉树的实验报告

数据结构二叉树的实验报告数据结构二叉树的实验报告一、引言数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据以便高效地访问和操作。

二叉树是数据结构中常见且重要的一种,它具有良好的灵活性和高效性,被广泛应用于各种领域。

本实验旨在通过实际操作和观察,深入了解二叉树的特性和应用。

二、实验目的1. 理解二叉树的基本概念和特性;2. 掌握二叉树的创建、遍历和查找等基本操作;3. 通过实验验证二叉树的性能和效果。

三、实验过程1. 二叉树的创建在实验中,我们首先需要创建一个二叉树。

通过输入一系列数据,我们可以按照特定的规则构建一棵二叉树。

例如,可以按照从小到大或从大到小的顺序将数据插入到二叉树中,以保证树的有序性。

2. 二叉树的遍历二叉树的遍历是指按照一定的次序访问二叉树中的所有节点。

常见的遍历方式有前序遍历、中序遍历和后序遍历。

前序遍历是先访问根节点,然后再依次遍历左子树和右子树;中序遍历是先遍历左子树,然后访问根节点,最后再遍历右子树;后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。

3. 二叉树的查找二叉树的查找是指在二叉树中寻找指定的节点。

常见的查找方式有深度优先搜索和广度优先搜索。

深度优先搜索是从根节点开始,沿着左子树一直向下搜索,直到找到目标节点或者到达叶子节点;广度优先搜索是从根节点开始,逐层遍历二叉树,直到找到目标节点或者遍历完所有节点。

四、实验结果通过实验,我们可以观察到二叉树的特性和性能。

在创建二叉树时,如果按照有序的方式插入数据,可以得到一棵平衡二叉树,其查找效率较高。

而如果按照无序的方式插入数据,可能得到一棵不平衡的二叉树,其查找效率较低。

在遍历二叉树时,不同的遍历方式会得到不同的结果。

前序遍历可以用于复制一棵二叉树,中序遍历可以用于对二叉树进行排序,后序遍历可以用于释放二叉树的内存。

在查找二叉树时,深度优先搜索和广度优先搜索各有优劣。

深度优先搜索在空间复杂度上较低,但可能会陷入死循环;广度优先搜索在时间复杂度上较低,但需要较大的空间开销。

数据结构课程设计建立二叉树并求指定结点路径程序源代码

数据结构课程设计建立二叉树并求指定结点路径程序源代码

09级数据结构课程设计程序源代码#include"stdio.h"#include"stdlib.h"#define num 100#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define RIGHT 1#define LEFT 0typedef int Status;typedef char DataType;int found;typedef struct node{DataType data;struct node *lchild,*rchild;}BinTNode,*BinTree;BinTNode *p;int CreateBiTree(BinTree *bt){char ch;scanf("%c",&ch);if(ch=='@')(*bt)=NULL;else{(*bt)=(BinTNode *)malloc(sizeof(BinTNode));if(!(*bt))return ERROR;(*bt)->data=ch;CreateBiTree(&(*bt)->lchild);CreateBiTree(&(*bt)->rchild);}return OK;}int Inorder(BinTree &bt)/{BinTNode *stack[num]; //定义栈数组int top=0; //初始化栈stack[top]=bt;do{while(NULL!=stack[top]){ //扫描根结点及其所有的左结点并入栈top=top+1;stack[top]=stack[top-1]->lchild;}top=top-1; //退栈if(top>=0) //判断栈是否为空{printf("%c",stack[top]->data); //访问结点stack[top]=stack[top]->rchild; //扫描右子树}}while(top>=0);return OK;}//Inorderint Depth(BinTree bt)//求二叉树的深度{int h,lh,rh;if(!bt)h=0;else{lh=Depth(bt->lchild);rh=Depth(bt->rchild);if(lh>=rh)h=lh+1;elseh=rh+1;}return h;}int LeafCount(BinTree bt)//5.求叶子节点的个数{if(!bt) return 0; //空树没有叶子else if(!bt->lchild&&!bt->rchild) return 1; //叶子结点else return LeafCount(bt->lchild)+LeafCount(bt->rchild); }//LeafCountint Exchange(BinTree *bt){BinTNode *temp;if((*bt)==NULL)return ERROR;else{temp=(*bt)->lchild;(*bt)->lchild=(*bt)->rchild;(*bt)->rchild=temp;}Exchange(&(*bt)->lchild);Exchange(&(*bt)->rchild);return OK;}void main(){ BinTree bt;int xz=1;char ch;BinTree tree;while(xz){printf(" 建立二叉树并求指定结点路径\n");printf("===========================\n");printf(" 1.建立二叉树的存储结构\n");printf(" 2.求解二叉树的中序遍历\n");printf(" 3.求二叉树指定节点的路径\n");printf(" 4.求二叉树的深度\n");printf(" 5.求二叉树的叶子节点个数\n");printf(" 6.将二叉树左右子树交换\n");printf(" 0.退出系统\n");printf("===========================\n");printf(" 请选择:(0-6) \n");scanf("%d",&xz); getchar();switch(xz){case 0:break;case 1:printf("输入二叉树的先序序列结点值:\n");CreateBiTree(&tree);getchar();printf("二叉树的链式存储结构建立完成! \n");break;case 2:printf("该二叉树的中序遍历序列是:\n");Inorder(tree);printf("\n");break;case 3:printf("输入要求路径的结点值:");scanf("%c",&ch);getchar();FindNodePath(tree,ch);break;case 4:printf("该二叉树的深度为:%d\n",Depth(tree));printf("\n");break;case 5:printf("该二叉树的叶子结点个数为:%d\n",LeafCount(tree));printf("\n");break;case 6:Exchange(&tree);printf("该二叉树的左右结点已交换成功,其中序遍历序列是:");Inorder(tree);printf("\n");break;}}。

树和二叉树的实验报告

树和二叉树的实验报告

《数据结构》实验报告题目: 树和二叉树一、用二叉树来表示代数表达式(一)需求分析输入一个正确的代数表达式, 包括数字和用字母表示的数, 运算符号+ - * / ^ =及括号。

系统根据输入的表达式建立二叉树, 按照先括号里面的后括号外面的, 先乘后除的原则, 每个节点里放一个数字或一个字母或一个操作符, 括号不放在节点里。

分别先序遍历, 中序遍历, 后序遍历此二叉树, 并输出表达式的前缀式, 中缀式和后缀式。

(二)系统设计1.本程序中用到的所有抽象数据类型的定义;typedef struct BiNode //二叉树的存储类型{char s[20];struct BiNode *lchild,*rchild;}BiTNode,*BiTree;2.主程序的流程以及各程序模块之间的层次调用关系, 函数的调用关系图:3. 列出各个功能模块的主要功能及输入输出参数void push(char cc)初始条件: 输入表达式中的某个符号操作结果: 将输入的字符存入buf数组中去BiTree Create_RTree()初始条件: 给出二叉树的定义表达式操作结果:构造二叉树的右子树, 即存储表达式等号右侧的字符组BiTree Create_RootTree()初始条件: 给出二叉树的定义表达式操作结果:构造存储输入表达式的二叉树, 其中左子树存储‘X’, 根节点存储‘:=’void PreOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:先序遍历T, 对每个节点调用函数Visit一次且仅一次void InOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:中序遍历T, 对每个节点调用函数Visit一次且仅一次void PostOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:后序遍历T, 对每个节点调用函数Visit一次且仅一次int main()主函数, 调用各方法, 操作成功后返回0(三)调试分析调试过程中还是出现了一些拼写错误, 经检查后都能及时修正。

建立二叉树并求指定结点路径数据结构课程设计报告

建立二叉树并求指定结点路径数据结构课程设计报告

**大学电子与信息工程学院数据结构课程设计报告( 2010——2011年度第一学期)课程名称:数据结构课程设计题目:建立二叉树并求指定结点路径院系:电信学院计算机系班级:计算机08本(1)姓名:**学号:**指导教师:**成绩:2010 年12月4日成绩评定一、指导教师评语二、成绩指导教师:日期:年月日[题目]建立二叉树并求指定结点路径[问题描述]要求能够按先序遍历的次序输入二叉树的各个结点,并能够输出中序遍历的序列,以及指定结点的路径[基本要求]分别建立二叉树存储结构的输入函数、输出中序遍历的函数,以及输出指定结点路径的函数课程设计的需求和规格说明1、定义二叉树的存储结构,每个结点中设置三个域,即值域、左指针域、右指针域。

要建立二叉树T的链式存储结构,即建立二叉链表。

根据输入二叉树结点的形式不同,建立的方法也不同,本系统采用先序序列递归建立二叉树,建立如下图所示的二叉树。

应该在程序运行窗口的主控菜单后,先选择“1”并回车,紧接着在程序运行窗口中提示信息“输入二叉树的先序序列结点值:”之后,采用以下字符序列:ABC@@DE@G@@F@@@(以@替代空格)作为建立二叉树T的输入字符序列并回车,窗口出现:二叉树的链式存储结构建立完成!图1 二叉树的图形结构2、二叉树的遍历。

本系统采用非递归中序遍历算法进行中序遍历,这意味着遍历右子树时不再需要保存当前层的根指针,可直接修改栈顶记录中的指针即可。

需要在程序运行窗口的主控菜单中选择“2”并回车,程序运行窗口会出现以下中序遍历序列:该二叉树的中序遍历序列是: CBEGDFA3、求二叉树的指定结点路径。

在程序运行窗口的主控菜单中选择“3”并回车,在程序运行窗口中提示信息“输入要求路径的结点值:”输入“G”并回车,会得到结果为:→A→B→D→E→G如果输入“I”并回车,会得到结果为:没有要求的结点!设计设计思想:我们知道,在二叉树上无论采用哪种遍历方法,都能够访问遍树中的所有结点。

数据结构实验报告-树(二叉树)

数据结构实验报告-树(二叉树)

实验5:树(二叉树)(采用二叉链表存储)一、实验项目名称二叉树及其应用二、实验目的熟悉二叉树的存储结构的特性以及二叉树的基本操作。

三、实验基本原理之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。

线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。

在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。

直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。

四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和预定义2.创建二叉树3.前序遍历4.中序遍历5.后序遍历6.总结点数7.叶子节点数8.树的深度9.树根到叶子的最长路径10.交换所有节点的左右子女11.顺序存储12.显示顺序存储13.测试函数和主函数对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:#include <bits/stdc++.h>using namespace std;#define MAX_TREE_SIZE 100typedef char ElemType;ElemType SqBiTree[MAX_TREE_SIZE];struct BiTNode{ElemType data;BiTNode *l,*r;}*T;void createBiTree(BiTNode *&T){ElemType e;e = getchar();if(e == '\n')return;else if(e == ' ')T = NULL;else{if(!(T = (BiTNode *)malloc(sizeof (BiTNode)))){cout << "内存分配错误!" << endl;exit(0);}T->data = e;createBiTree(T->l);createBiTree(T->r);}}void createBiTree2(BiTNode *T,int u) {if(T){SqBiTree[u] = T->data;createBiTree2(T->l,2 * u + 1);createBiTree2(T->r,2 * u + 2); }}void outputBiTree2(int n){int cnt = 0;for(int i = 0;cnt <= n;i++){cout << SqBiTree[i];if(SqBiTree[i] != ' ')cnt ++;}cout << endl;}void preOrderTraverse(BiTNode *T) {if(T){cout << T->data;preOrderTraverse(T->l);preOrderTraverse(T->r);}}void inOrderTraverse(BiTNode *T) {if(T){inOrderTraverse(T->l);cout << T->data;inOrderTraverse(T->r);}}void beOrderTraverse(BiTNode *T){if(T){beOrderTraverse(T->l);beOrderTraverse(T->r);cout << T->data;}}int sumOfVer(BiTNode *T){if(!T)return 0;return sumOfVer(T->l) + sumOfVer(T->r) + 1;}int sumOfLeaf(BiTNode *T){if(!T)return 0;if(T->l == NULL && T->r == NULL)return 1;return sumOfLeaf(T->l) + sumOfLeaf(T->r);}int depth(BiTNode *T){if(!T)return 0;return max(depth(T->l),depth(T->r)) + 1;}bool LongestPath(int dist,int dist2,vector<ElemType> &ne,BiTNode *T) {if(!T)return false;if(dist2 == dist)return true;if(LongestPath(dist,dist2 + 1,ne,T->l)){ne.push_back(T->l->data);return true;}else if(LongestPath(dist,dist2 + 1,ne,T->r)){ne.push_back(T->r->data);return true;}return false;}void swapVer(BiTNode *&T){if(T){swapVer(T->l);swapVer(T->r);BiTNode *tmp = T->l;T->l = T->r;T->r = tmp;}}//以下是测试程序void test1(){getchar();cout << "请以先序次序输入二叉树结点的值,空结点用空格表示:" << endl; createBiTree(T);cout << "二叉树创建成功!" << endl;}void test2(){cout << "二叉树的前序遍历为:" << endl;preOrderTraverse(T);cout << endl;}void test3(){cout << "二叉树的中序遍历为:" << endl;inOrderTraverse(T);cout << endl;}void test4(){cout << "二叉树的后序遍历为:" << endl;beOrderTraverse(T);cout << endl;}void test5(){cout << "二叉树的总结点数为:" << sumOfVer(T) << endl;}void test6(){cout << "二叉树的叶子结点数为:" << sumOfLeaf(T) << endl; }void test7(){cout << "二叉树的深度为:" << depth(T) << endl;}void test8(){int dist = depth(T);vector<ElemType> ne;cout << "树根到叶子的最长路径:" << endl;LongestPath(dist,1,ne,T);ne.push_back(T->data);reverse(ne.begin(),ne.end());cout << ne[0];for(int i = 1;i < ne.size();i++)cout << "->" << ne[i];cout << endl;}void test9(){swapVer(T);cout << "操作成功!" << endl;}void test10(){memset(SqBiTree,' ',sizeof SqBiTree);createBiTree2(T,0);cout << "操作成功!" << endl;}void test11(){int n = sumOfVer(T);outputBiTree2(n);}int main(){int op = 0;while(op != 12){cout << "-----------------menu--------------------" << endl;cout << "--------------1:创建二叉树--------------" << endl;cout << "--------------2:前序遍历----------------" << endl;cout << "--------------3:中序遍历----------------" << endl;cout << "--------------4:后序遍历----------------" << endl;cout << "--------------5:总结点数----------------" << endl;cout << "--------------6:叶子节点数--------------" << endl;cout << "--------------7:树的深度----------------" << endl;cout << "--------------8:树根到叶子的最长路径----" << endl;cout << "--------------9:交换所有节点左右子女----" << endl;cout << "--------------10:顺序存储---------------" << endl;cout << "--------------11:显示顺序存储-----------" << endl;cout << "--------------12:退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl;if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1();break;case 2:test2();break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:cout << "测试结束!" << endl;break;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果测试用例:1.创建二叉树(二叉链表形式)2.前序遍历3.中序遍历4.后序遍历5.总结点数6.叶子结点数7.树的深度8.树根到叶子的最长路径9.交换所有左右子女10.顺序存储七、思考讨论题或体会或对改进实验的建议通过这次实验,我掌握了二叉树的顺序存储和链式存储,体会了二叉树的存储结构的特性,掌握了二叉树的树上相关操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告-二叉树根节点到指定节点的路径数据结构课程设计报告二叉树根节点到指定节点的路径——递归调用思想班级:__ 软件092________ 姓名:_ __________ 指导教师:__ 成绩:___________________ 信息工程学院2011 年 6 月17 日- 2 - 摘要(题目): 二叉树根节点到指定节点的路径 1.引言二叉树是n 个结点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件;(1)有且仅有一个称为根的结点;(2)其余结点分为两个互不相交的集合T1,T2,并且T1,T2,都是二叉树,分别称为根的左子树和右子树。

二叉树形结构在客观世界中大量存在,如行政组织机构和人类社会的家谱关系等都可用二叉树结构形象地表示。

在计算机应用领域,二叉树也被广泛地应用。

例如在编译程序中,可用二叉树来表示源程序的语法结构;在数据库系统中,可用二叉树来表示组织信息;在计算机图形学中,可用二叉树来表示图像关系等。

因此对二叉树的研究具有重要意义。

2.需求分析利用一个简单的菜单,通过菜单项进行选择,实现和完成如下功能:用先序输入,建立二叉树存储结构、求指定结点的路径。

对于建立二叉树存储结构,考虑到栈和队列的存储结构比较繁琐,从而定义一指针数组来一一存储该二叉树先序遍历过的结点,并对该结点进行判断是否为指定的目标结点,并进行输出等操作。

3.概要设计对二叉树采用链式存储结构,其结构定义如下:typedef structnode{ DataType data; struct node*lchild,*rchild; }BinTNode,*BinTree; 每个结点中设置三个域,即值域data,左指针域*lchild 和右指针域*rchild。

本程序分为6 大模块:全局变量定义、创建结构体、创建二叉链表存储表示、查找目标结点、求结点路径、主函数。

(1)全局变量定义(2)创建结构体(3)创建二叉链表存储表示:定义二叉树的链式存储结构,输入数据生成二叉树。

(4)查找目标结点:采用二叉链表作为存储结构,利用递归方法,对各个结点进行判断改结点是否在二叉树中。

- 3 - (5)求结点路径:采用二叉链表作为存储结构,利用先序遍历二叉树方法以及指针数组的存储结构方法,对结点路径的遍历查找及输出。

(6)主函数程序流程图重要函数有主函数int main()输入函数scanf()输出函数printf()二叉树的先序建立函数CreateBiTree()结点查找函数FindBT()求结点路径函数NodePath()4.详细设计(1)定义二叉树用链式存储结构存储二叉树。

其中,了lchild 和rchild 是分别指向该结点左孩子和右孩子的指针,data 是数据元素的内容。

定义二叉树结点值的类型为字符型且结点个数不超过100 个,具体实现方法如下:二叉树的根节点到指定节点的路径主程序代码输入函数输出函数建立函数查找函数求路径函数- 4 - typedef struct node{ DataType data; struct node*lchild,*rchild; }BinTNode,*BinTree; (2)建立二叉树创建二叉链表存储的二叉树。

按二叉树带空指针的先序次序输入结点值,结点类型为字符型。

按先序次序输入,其中“@”表示空结点。

算法是按照先序遍历思想设计的。

构造二叉链表表示的二叉树,“@”符号表示空树。

具体实现方法如下:Status CreateBiTree(BinTree &bt) { char ch; printf("ch="); scanf("%c",&ch); getchar(); if (ch=='@') bt=NULL; else { bt=(BinTNode *)malloc(sizeof(BinTNode)); bt->data=ch; //生成根结点CreateBiTree(bt->lchild); //构造左子树CreateBiTree(bt->rchild); //构造右子树} return OK; } (3)查找函数- 5 - 函数功能是用递归方法对二叉树进行先序遍历查找,调用此函数可以返回二叉树中指定目标结点。

算法思想:若找到目标结点,则返回该目标结点;否则访问二叉树的根结点;先序遍历根的左子树;先序遍历根的右子树。

具体实现方法如下:void FindBT(BinTree bt,DataType x) { if((bt!=NULL) && !found) { if(bt->data==x){p=bt;found=1;} else { FindBT(bt->lchild,x); //遍历查找左子树FindBT(bt->rchild,x); //遍历查找右子树} } } BinTNode *Findx(BinTree bt,DataType x) {//按给定值查找结点int found=0; //用found 来作为是否查找到的标志BinTree p=NULL; //置空指针FindBT(bt,x); return(p); } 7)求指定结点路径:该函数功能是根据已创建的二叉树和输入的目标结点,调用此函数可以查找并输出目标结点的路径。

算法思想:根据先序遍历二叉树的递归定义,采用一个指针数组来保存返回的结点。

先扫描根结点的左子树上的结点并写入指针数组。

判断该结点是否与指定目标结点相等,若不相等,然后扫描该结点的右结点并写- 6 - 入指针数组,再扫描该右结点的所有左结点写入指针数组。

当一个结点的左孩子树均访问完后再访问该结点,并与给定的结点比较。

若相等,则循环输出指针数组中的所有元素,而这个顺序值就是要求的路径。

若不相等,则继续上述过程。

具体实现方法如下:void NodePath(BinTree bt,BinTNode *ch) {//求二叉树根结点到给定结点*p 的路径typedef enum {FALSE,TRUE}boolean; BinTNode *stack[num]; //定义指针数组int tag[num]; int i,top; boolean find; BinTNode *s; find=FALSE; top=0; s=bt; do { while(s!=NULL) {//扫描左子树top++; stack[top]=s; tag[top]=0; s=s->lchild; } if(top>0) { s=stack[top]; if(tag[top]==1) - 7 - { if(s==ch) {//找到ch,则显示从根结点到ch 的路径for(i=1;i<=top;i++) printf("->%c",stack[i]->data);find=TRUE; } else top--; s=stack[top]; }//endif if(top>0 && !find) { if(tag[top]!=1) { s=s->rchild; //扫描右子树tag[top]=1; } else s=NULL; }//endif }//endlif }while(!find && top!=0); } (8)主函数:- 8 - 该函数为程序的主函数功能是循环输出菜单,功能界面;从界面获取功能菜单中对应的字符,通过switch()语句实现对函数的调用,进而实现功能。

具体代码如下:int main() { bool isStop; BinTree bt; char ch1; int xz=1; printf("\t*********************************************** ***********\n"); printf("\t *\t\t\t\t\t\t\t *\n"); printf("\t *\t\t 欢迎来到这里\t\t *\n"); printf("\t * \t \t 建立二叉树并求指定结点路径\t \t *\n"); printf("\t *\t\t\t\t\t\t\t *\n"); printf("\t*********************************************** ***********\n"); while(xz){ /*****输出菜单,功能*****/ printf("\n \n"); printf("=================================== =============\n"); - 9 - printf(" 1.建立二叉树的存储结构\n"); printf(" 2.求二叉树指定结点的路径\n"); printf(" 0.Exit System!\n"); printf("=================================== =============\n"); printf("请选择:(0-2)\n");scanf("%d",&xz); getchar(); switch(xz) { case 1:printf("输入二叉树的先序序列结点值:\n"); CreateBiTree(bt); printf("二叉树的链式存储结构建立完成! \n"); printf("\n"); break; case 2:printf("路径的节点值是:\n"); ch1=getchar();p=NULL; found=0; Findx(bt,ch1); if(p!=NULL) - 10 - NodePath(bt,p); else printf("没有要求的节点!\n");printf("\n"); break; }// switch }// while } 源程序:#include #include #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef structnode{ DataType data; struct node*lchild,*rchild; }BinTNode,*BinTree; int found; BinTNode *p; Status CreateBiTree(BinTree &bt) - 11 - { char ch; printf("ch="); scanf("%c",&ch); getchar(); if (ch=='@')bt=NULL; else { bt=(BinTNode *)malloc(sizeof(BinTNode)); bt->data=ch; //生成根结点CreateBiTree(bt->lchild); //构造左子树CreateBiTree(bt->rchild); //构造右子树} return OK; } void NodePath(BinTree bt,BinTNode *ch) {//求二叉树根结点到给定结点*p 的路径typedef enum {FALSE,TRUE}boolean; BinTNode *stack[num]; //定义栈int tag[num]; int i,top; boolean find; BinTNode *s;find=FALSE; top=0; s=bt; - 12 - do { while(s!=NULL) {//扫描左子树top++; stack[top]=s; tag[top]=0;s=s->lchild; } if(top>0) { s=stack[top]; if(tag[top]==1) { if(s==ch) {//找到ch,则显示从根结点到ch 的路径for(i=1;i<=top;i++) printf("->%c",stack[i]->data);find=TRUE; } else top--; s=stack[top]; }//endif if(top>0&& !find) { - 13 - if(tag[top]!=1) { s=s->rchild; //扫描右子树tag[top]=1; } elses=NULL; }//endif }//endlif }while(!find && top!=0); } void FindBT(BinTree bt,DataType x) { if((bt!=NULL) && !found) { if(bt->data==x) {p=bt;found=1;} else{ FindBT(bt->lchild,x); //遍历查找左子树FindBT(bt->rchild,x); //遍历查找右子树} } } - 14 - BinTNode *Findx(BinTree bt,DataType x) {//按给定值查找结点int found=0; //用found 来作为是否查找到的标志BinTree p=NULL; //置空指针FindBT(bt,x); return(p); } int main() { bool isStop; BinTree bt; char ch1; int xz=1; printf("\t*********************************************** ***********\n"); printf("\t *\t\t\t\t\t\t\t *\n"); printf("\t *\t\t 欢迎来到这里\t\t *\n"); printf("\t * \t \t 建立二叉树并求指定结点路径\t \t *\n"); printf("\t *\t\t\t\t\t\t\t *\n"); printf("\t*********************************************** ***********\n"); - 15 - while(xz){ /*****输出菜单,功能*****/ printf("\n \n"); printf("=================================== =============\n"); printf(" 1.建立二叉树的存储结构\n"); printf(" 2.求二叉树指定结点的路径\n"); printf("0.Exit System!\n"); printf("=================================== =============\n"); printf("请选择:(0-2)\n");scanf("%d",&xz); getchar(); switch(xz) { case 1:printf("输入二叉树的先序序列结点值:\n"); CreateBiTree(bt); printf("二叉树的链式存储结构建立完成! \n"); printf("\n"); break; - 16 - case 2:printf("路径的节点值是:\n"); ch1=getchar(); p=NULL; found=0; Findx(bt,ch1); if(p!=NULL) NodePath(bt,p); else printf("没有要求的节点!\n");printf("\n"); break; }// switch }// while } 5.测试结果- 17 - - 18 - 6.调试分析本设计是先序输入的,当然也可以中序和后序输入,为了减小时间和空间复杂度,所以只设计了先序输入。

相关文档
最新文档