数据结构课程设计报告二叉树的遍历
- 格式:doc
- 大小:110.00 KB
- 文档页数:18
二叉树的遍历实验报告二叉树的遍历实验报告引言:二叉树是一种常见的数据结构,它由节点和连接节点的边组成。
在实际应用中,我们经常需要对二叉树进行遍历,以便对其中的节点进行访问和操作。
本次实验旨在探索二叉树的遍历算法,并通过实验验证其正确性和效率。
一、二叉树的定义和基本操作二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
根据节点的访问顺序,二叉树的遍历可以分为前序遍历、中序遍历和后序遍历三种方式。
前序遍历是指先访问根节点,然后按照左子树、右子树的顺序递归地进行遍历;中序遍历是指先按照左子树、根节点、右子树的顺序递归地进行遍历;后序遍历是指先按照左子树、右子树、根节点的顺序递归地进行遍历。
二、实验设计和方法为了验证二叉树的遍历算法的正确性和效率,我们设计了以下实验方案:1. 构建二叉树:我们首先构建一个具有一定规模的二叉树,以模拟实际应用中的情况。
为了方便起见,我们选择随机生成一棵二叉树,并确保其结构合理。
2. 实现遍历算法:我们根据前文所述的遍历方式,实现了相应的遍历算法。
在实现过程中,我们考虑到了递归和迭代两种方式,并分别进行了实验比较。
3. 遍历实验:我们使用不同规模的二叉树进行遍历实验,并记录遍历的结果和所花费的时间。
通过对比不同规模下不同遍历方式的结果和时间,我们可以评估遍历算法的效率和准确性。
三、实验结果和分析在实验中,我们构建了一棵具有1000个节点的二叉树,并分别使用前序、中序和后序遍历算法进行遍历。
通过实验结果的比较,我们得出以下结论:1. 遍历结果的正确性:无论是前序、中序还是后序遍历,我们都能够正确地访问到二叉树中的每个节点。
这表明我们所实现的遍历算法是正确的。
2. 遍历算法的效率:在1000个节点的二叉树中,我们发现中序遍历算法的执行时间最短,后序遍历算法的执行时间最长,前序遍历算法的执行时间居中。
这是因为中序遍历算法在访问节点时可以尽可能地减少递归次数,而后序遍历算法需要递归到最深层才能返回。
实验报告一,实验目的:·掌握二叉树的链式存储结构;·掌握构造二叉树的方法;·加深对二叉树的中序遍历的理解;二,实验方法:·用递归调用算法中序遍历二叉树。
三,实验步骤:·通过链式存储建立一颗二叉树。
·设计一个算法实现中序遍历二叉树。
四,具体实验步骤:#include<stdio.h>#include<stdlib.h>#define LEFT 0#define RIGHT 1#define TRUE 1#define FALSE 0typedef struct _BTNODE{char c;struct _BTNODE *lchild;struct _BTNODE *rchild;}BTNODE,*PBTNODE;void PrintBTree(PBTNODE p,int depth);void ConstructBTree(PBTNODE p);void InorderTraverse(PBTNODE p);void main(){PBTNODE p;p=(PBTNODE)calloc(1,sizeof(BTNODE));printf("Input the data:");ConstructBTree(p);PrintBTree(p,0);printf("Now InorderTraverse:");InorderTraverse(p);printf("\nPress any key to continue...");getchar();}void PrintBTree(PBTNODE p,int depth){int i;if(p==NULL){return;}else{for(i=0;i<depth;i++){printf("--");}printf(">");printf("%c\n",p->c);PrintBTree(p->lchild,depth+1);PrintBTree(p->rchild,depth+1);}}void ConstructBTree(PBTNODE p){int side;char c;side=LEFT;while(TRUE){scanf("%c",&c);if(c=='\n'){//printf("EOF\n");return;}// printf("%d\n",c);switch(c){case '|':break;case')':return;case',':side=RIGHT;break;case'(':if(side==LEFT){if(p->lchild==NULL){p->lchild=(PBTNODE)calloc(1,sizeof(BTNODE));}ConstructBTree(p->lchild);}else{if(p->rchild==NULL){p->rchild=(PBTNODE)calloc(1,sizeof(BTNODE));}ConstructBTree(p->rchild);}break;default:if(side==LEFT){p->lchild=(PBTNODE)calloc(1,sizeof(BTNODE));p->lchild->c=c;}else{p->rchild=(PBTNODE)calloc(1,sizeof(BTNODE));p->rchild->c=c;}}}}void InorderTraverse(PBTNODE p){if(p==NULL){return;}else{InorderTraverse(p->lchild);printf("[%c] ",p->c);InorderTraverse(p->rchild);}return;}五,实验过程:·输出:Input the date;·输入:1(2(3,4),5(6,7));·输出:Now InorderTraverse:【3】【2】【4】【1】【6】【5】【7】;六,上机实验体会:·体会到熟练掌握各种程序算法的重要性;·通过上机练习,充分理解了链式建立二叉树的算法;·形象的了解二叉树的结构,能够熟练的进行先序,中序,后序遍历二叉树。
数据结构实验报告二叉树数据结构实验报告:二叉树引言:数据结构是计算机科学中的重要基础,它为我们提供了存储和组织数据的方式。
二叉树作为一种常见的数据结构,广泛应用于各个领域。
本次实验旨在通过实践,深入理解二叉树的概念、性质和操作。
一、二叉树的定义与性质1.1 定义二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树可以为空树,也可以是由根节点和左右子树组成的非空树。
1.2 基本性质(1)每个节点最多有两个子节点;(2)左子树和右子树是有顺序的,不能颠倒;(3)二叉树的子树仍然是二叉树。
二、二叉树的遍历2.1 前序遍历前序遍历是指首先访问根节点,然后按照先左后右的顺序遍历左右子树。
在实际应用中,前序遍历常用于复制一颗二叉树或创建二叉树的副本。
2.2 中序遍历中序遍历是指按照先左后根再右的顺序遍历二叉树。
中序遍历的结果是一个有序序列,因此在二叉搜索树中特别有用。
2.3 后序遍历后序遍历是指按照先左后右再根的顺序遍历二叉树。
后序遍历常用于计算二叉树的表达式或释放二叉树的内存。
三、二叉树的实现与应用3.1 二叉树的存储结构二叉树的存储可以使用链式存储或顺序存储。
链式存储使用节点指针连接各个节点,而顺序存储则使用数组来表示二叉树。
3.2 二叉树的应用(1)二叉搜索树:二叉搜索树是一种特殊的二叉树,它的左子树上的节点都小于根节点,右子树上的节点都大于根节点。
二叉搜索树常用于实现查找、插入和删除等操作。
(2)堆:堆是一种特殊的二叉树,它满足堆序性质。
堆常用于实现优先队列,如操作系统中的进程调度。
(3)哈夫曼树:哈夫曼树是一种带权路径最短的二叉树,常用于数据压缩和编码。
四、实验结果与总结通过本次实验,我成功实现了二叉树的基本操作,包括创建二叉树、遍历二叉树和查找节点等。
在实践中,我进一步理解了二叉树的定义、性质和应用。
二叉树作为一种重要的数据结构,在计算机科学中有着广泛的应用,对于提高算法效率和解决实际问题具有重要意义。
[精品]【数据结构】二叉树实验报告二叉树实验报告一、实验目的:1.掌握二叉树的基本操作;2.理解二叉树的性质;3.熟悉二叉树的广度优先遍历和深度优先遍历算法。
二、实验原理:1.二叉树是一种树形结构,由n(n>=0)个节点组成;2.每个节点最多有两个子节点,称为左子节点和右子节点;3.二叉树的遍历分为四种方式:前序遍历、中序遍历、后序遍历和层次遍历。
三、实验环境:1.编程语言:C++;2.编译器:Dev-C++。
四、实验内容:1.定义二叉树节点结构体:struct BinaryTreeNode{int data; // 节点数据BinaryTreeNode *leftChild; // 左子节点指针BinaryTreeNode *rightChild; // 右子节点指针};2.初始化二叉树:queue<BinaryTreeNode *> q; // 使用队列存储节点q.push(root);int i = 1; // 创建子节点while (!q.empty() && i < length){BinaryTreeNode *node = q.front();q.pop();if (data[i] != -1) // 创建左子节点 {BinaryTreeNode *leftChild = new BinaryTreeNode;leftChild->data = data[i];leftChild->leftChild = nullptr;leftChild->rightChild = nullptr;node->leftChild = leftChild;q.push(leftChild);}i++;if (data[i] != -1) // 创建右子节点 {BinaryTreeNode *rightChild = new BinaryTreeNode;rightChild->data = data[i];rightChild->leftChild = nullptr;rightChild->rightChild = nullptr;node->rightChild = rightChild;q.push(rightChild);}i++;}return root;}3.前序遍历二叉树:五、实验结果:输入:int data[] = {1, 2, 3, 4, -1, -1, 5, 6, -1, -1, 7, 8};输出:前序遍历结果:1 2 4 5 3 6 7 8中序遍历结果:4 2 5 1 6 3 7 8后序遍历结果:4 5 2 6 8 7 3 1层次遍历结果:1 2 3 4 5 6 7 8通过本次实验,我深入理解了二叉树的性质和遍历方式,并掌握了二叉树的基本操作。
数据结构二叉树的实验报告数据结构二叉树的实验报告一、引言数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据以便高效地访问和操作。
二叉树是数据结构中常见且重要的一种,它具有良好的灵活性和高效性,被广泛应用于各种领域。
本实验旨在通过实际操作和观察,深入了解二叉树的特性和应用。
二、实验目的1. 理解二叉树的基本概念和特性;2. 掌握二叉树的创建、遍历和查找等基本操作;3. 通过实验验证二叉树的性能和效果。
三、实验过程1. 二叉树的创建在实验中,我们首先需要创建一个二叉树。
通过输入一系列数据,我们可以按照特定的规则构建一棵二叉树。
例如,可以按照从小到大或从大到小的顺序将数据插入到二叉树中,以保证树的有序性。
2. 二叉树的遍历二叉树的遍历是指按照一定的次序访问二叉树中的所有节点。
常见的遍历方式有前序遍历、中序遍历和后序遍历。
前序遍历是先访问根节点,然后再依次遍历左子树和右子树;中序遍历是先遍历左子树,然后访问根节点,最后再遍历右子树;后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。
3. 二叉树的查找二叉树的查找是指在二叉树中寻找指定的节点。
常见的查找方式有深度优先搜索和广度优先搜索。
深度优先搜索是从根节点开始,沿着左子树一直向下搜索,直到找到目标节点或者到达叶子节点;广度优先搜索是从根节点开始,逐层遍历二叉树,直到找到目标节点或者遍历完所有节点。
四、实验结果通过实验,我们可以观察到二叉树的特性和性能。
在创建二叉树时,如果按照有序的方式插入数据,可以得到一棵平衡二叉树,其查找效率较高。
而如果按照无序的方式插入数据,可能得到一棵不平衡的二叉树,其查找效率较低。
在遍历二叉树时,不同的遍历方式会得到不同的结果。
前序遍历可以用于复制一棵二叉树,中序遍历可以用于对二叉树进行排序,后序遍历可以用于释放二叉树的内存。
在查找二叉树时,深度优先搜索和广度优先搜索各有优劣。
深度优先搜索在空间复杂度上较低,但可能会陷入死循环;广度优先搜索在时间复杂度上较低,但需要较大的空间开销。
《数据结构》课程设计报告题目:二叉树的遍历日期:2009-12-22年级:班级:姓名:学号:一.实习目的更好的了解二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现流程及操作步骤。
加深理论知识,提高实践能力。
二.问题描述二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,建树的实现。
三.概要设计1.创建二叉树2.二叉树的递归遍历算法<前、中、后)3.二叉树的层次遍历算法4.二叉树的非递归遍历算法<前、中、后)5.退出以选择面板开始,显得更为清晰。
其中3,4,5,6,8为添加内容,有助于更好的了解二叉树。
四.详细设计1.创建二叉树(1>定义二叉树结点值的类型为字符型。
(2>结点个数不超过10个。
(3>按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树。
2.二叉树的递归遍历算法<前、中、后)DLR(1>访问根结点。
(2>先序遍历根结点的左子数。
(3>先序遍历根结点的右子数。
LDR(1>先序遍历根结点的左子数。
(2>访问根结点。
(3>先序遍历根结点的右子数。
LRD(1>先序遍历根结点的左子数。
(2>先序遍历根结点的右子数。
(3>访问根结点。
3.二叉树的层次遍历算法(1>访问该元素所指结点。
(2>若该元素所指结点的左右孩子结点非空,则该元素所指结点的左孩子指针和右孩子指针顺序入队。
4.二叉树的非递归遍历算法<前、中、后)<1)非递归的先序遍历算法a.访问结点的数据域。
b.指针指向p的左孩子结点。
c.从栈中弹出栈顶元素。
d.指针指向p的右孩子结点。
<2)非递归的中序遍历算法a.指针指向p的左孩子结点。
b.从栈中弹出栈顶元素。
c.访问结点的数据域。
d.指针指向p的右孩子结点。
<3)非递归的后序遍历算法bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。
数据结构程序设计报告学院:班级:学号:姓名:实验名称:二叉树的建立与遍历一、实验目的:1.掌握二叉树的二叉链表存储结构;2.掌握二叉树创建方法;3.掌握二叉树的先序、中序、后序的递归实现方法。
二、实验内容和要求:创建二叉树,分别对该二叉树进行先序、中序、后序遍历,并输出遍历结果。
三、叉树的建立与遍历代码如下:#include <stdio.h>#include <malloc.h>struct tnode//结点结构体{char data;struct tnode *lchild,*rchild;};typedef struct tnode TNODE;TNODE *creat(void){TNODE *root,*p;TNODE *queue[50];int front=0,rear=-1,counter=0;//初始队列中需要的变量front、rear 和计数器counterchar ch;printf("建立二叉树,请输入结点:(#表示虚节点,!表示结束)\n"); ch=getchar();while(ch!='!'){if(ch!='#'){p=(TNODE *)malloc(sizeof(TNODE));p->data=ch;p->lchild=NULL;p->rchild=NULL;rear++;queue[rear]=p;//把非#的元素入队if(rear==0)//如果是第一个元素,则作为根节点{root=p;counter++;}else{if(counter%2==1)//奇数时与其双亲的左子树连接{queue[front]->lchild=p;}if(counter%2==0)//偶数时与其双亲的右子树连接{queue[front]->rchild=p;front++;}counter++;}}else//为#时,计数,但不连接结点{if(counter%2==0)front++;counter++;}ch=getchar();}return root;}void preorder(TNODE *bt)//先序遍历{if(bt!=NULL){printf("%c ",bt->data);preorder(bt->lchild);preorder(bt->rchild);}}void inorder(TNODE *bt)//中序遍历{if(bt!=NULL){inorder(bt->lchild);printf("%c ",bt->data);inorder(bt->rchild);}}void postorder(TNODE *bt)//后序遍历{if(bt!=NULL){postorder(bt->lchild);postorder(bt->rchild);printf("%c ",bt->data);}}int main(){TNODE *root;root=creat();printf("递归先序遍历是:");preorder(root);printf("\n");printf("递归中序遍历是:");inorder(root);printf("\n");printf("递归后序遍历是:");postorder(root);printf("\n");return 0;}四、程序运行结果:五、程序设计指导:1.创建二叉树的算法:首先对一般的二叉树,添加若干个虚结点使其成为完全二叉树,然后依次输入结点信息,若输入的结点不是虚结点,则建立一个新结点,若是第一个,则令其为根结点,否则将新结点链接至它的双亲结点上。
实验报告课程名称:数据结构与算法课程类型:必修实验项目:树型结构及应用实验题目:二叉树的遍历及应用一、实验目的1.通过对二叉树的各种操作更好理解树型结构及其应用;2.了解各种二叉树的遍历算法;3.理解递归和非递归的差别。
二、实验要求及实验环境实验要求:1.编写建立二叉树(大于10个结点) 的二叉链表存储结构(左右链表示)的程序,并以适当的形式显示和保存二叉树;2.采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序遍历的递归和非递归算法以及层序遍历算法,并以适当的形式显示和保存二叉树及其相应的遍历序列;3.给定一个二叉树,编写算法完成下列应用:(1)判断其是否为完全二叉树;(2)求二叉树中任意两个结点的公共祖先。
实验环境:codeblocks/Dev-C++三、设计思想(本程序中的用到的所有数据抽象数据性ADT的定义,主程序的流程图及各程序模块之间的调用关系)1. 所用的抽象数据性ADT的定义1)逻辑结构:栈:是一种特殊形式的线性表,所有的插入和删除操作都在栈顶。
栈的置空操作:void makenull(stack* s)判断栈是否为空:int empty(stack* s)返回栈顶元素:btree* top(stack* s)入栈操作:void push(btree* x, stack* s)出栈操作:void pop(stack* s)队列:是一种特殊形式的线性表,队尾入队,队首出队。
将队列置空:void makenull_q(queue* duilie)在队列后面插入T:void enqueue_q(btree* T, queue* duilie)判断队列是否为空:int empty_q(queue* duilie)返回队列的第一个元素:btree* front_q(queue* duilie)删除队列的第一个元素:void dequeue_q(queue* duilie)2) 存储结构定义了一个字符栈stack,一个队列queue,一个队列里面的节点node2,一个广义表数组char widechart[100],一个存储树节点数据的数组char store_ancestors[100]。
数据结构叉树的遍历实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中叉树的遍历算法,包括前序遍历、中序遍历和后序遍历,并通过实际编程实现来提高对这些算法的应用能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
三、实验原理(一)叉树的定义叉树是一种非线性的数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
(二)遍历算法1、前序遍历先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
2、中序遍历先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
3、后序遍历先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
四、实验步骤(一)定义叉树节点类```pythonclass TreeNode:def __init__(self, value):selfvalue = valueselfleft = Noneselfright = None```(二)前序遍历算法实现```pythondef pre_order_traversal(root):if root is not None:print(rootvalue, end="")pre_order_traversal(rootleft)pre_order_traversal(rootright)```(三)中序遍历算法实现```pythondef in_order_traversal(root):if root is not None:in_order_traversal(rootleft) print(rootvalue, end="")in_order_traversal(rootright)```(四)后序遍历算法实现```pythondef post_order_traversal(root):if root is not None:post_order_traversal(rootleft) post_order_traversal(rootright) print(rootvalue, end="")```(五)构建测试叉树```pythonroot = TreeNode(1)rootleft = TreeNode(2) rootright = TreeNode(3) rootleftleft = TreeNode(4) rootleftright = TreeNode(5)```(六)进行遍历操作并输出结果```pythonprint("前序遍历:")pre_order_traversal(root)print("\n中序遍历:")in_order_traversal(root)print("\n后序遍历:")post_order_traversal(root)```五、实验结果与分析(一)实验结果1、前序遍历: 1 2 4 5 32、中序遍历: 4 2 5 1 33、后序遍历: 4 5 2 3 1(二)结果分析1、前序遍历首先访问根节点,然后按照先左后右的顺序递归遍历子树。
南昌航空大学实验报告课程名称:数据结构实验名称:实验六二叉树的递归遍历及其应用班级:学生姓名:学号:指导教师评定:签名:题目:假设二叉树采用二叉链表结构。
设计并实现如下算法:先序递归建树,中序非递归遍历该树,输出各个结点的值,并求该树中单分支结点的个数。
一、需求分析1.用户可以根据自己的需求分别输入任意的一个二叉树,并且能够实现中序非递归遍历该树输出各个结点的数值。
2.通过已有的二叉树能够求出该树的单分支结点的个数。
3.程序执行的命令包括:(1)构造二叉树T (2)遍历二叉树(3)求二叉树单分支结点的个数(4)求二叉树的总结点数二、概要设计⒈为实现上述算法,需要链表的抽象数据类型:ADT Binarytree {数据对象:D是具有相同特性的数据元素的集合数据关系R:若D为空集,则R为空集,称binarytree为空二叉树;若D不为空集,则R为{H},H是如下二元关系;(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}不为空,则存在D-{root}={D1,Dr},且D1∩Dr为空集;(3)若D1不为空,则D1中存在唯一的元素x1,<root,x1>∈H,且存在D1上的关系H1是H的子集;若Dr不为空集,则Dr中存在唯一的元素Xr,<root,Xr>∈H,且存在Dr上的关系Hr为H的子集;H={<root,x1>,<root,Xr>,H1,Hr};(4) (D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一颗符合本定义的二叉树,称为根的右子树。
基本操作:Creatbitree(&S,definition)初始条件:definition给出二叉树S的定义操作结果:按definition构造二叉树Scounter(T)初始条件:二叉树T已经存在操作结果:返回二叉树的总的结点数onecount(T)初始条件:二叉树T已经存在操作结果:返回二叉树单分支的节点数Clearbintree(S)初始条件:二叉树S已经存在操作结果:将二叉树S清为空树Bitreeempty(S)初始条件:二叉树S已经存在操作结果:若S为空二叉树,则返回TRUE,否则返回FALSEBitreedepth(S,&e)初始条件:二叉树S已经存在操作结果:返回S的深度Parent(S)初始条件:二叉树S已经存在,e是S中的某个结点操作结果:若e是T的非根结点,则返回它的双亲,否则返回空Preordertraverse(S)初始条件:二叉树S已经存在,Visit是对结点操作的应用函数。
- . - .可修编- 摘要 针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象.如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。在树型结构的应用中又以二叉树最为常用。 二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为:NLR先根结点,然后左子树,右子树;中序遍历顺序为;LNR先左子树,然后根结点,右子树;后序遍历顺序为:LRN先左子树,然后右子树,根结点。由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树。对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为Ⅳ的一个序表的算法,都可以表示成一株二叉树。反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。 本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让我们对二叉树的理解有更好的效果。
关键词:二叉树的遍历;左子树;右子树;递归 - . -
.可修编- 目录 1.问题概述3 1.1问题描述3 1.2需求分析3 1.3设计容和要求4 1.4流程图及结构图4 2.概要设计5 2.1数据结构设计:5 2.2源程序代码7 3.调试分析13 3.1调试中的问题13 4.测试结果14 总结17 参考文献18 - . -
.可修编- 1.问题概述 1.1问题描述 创建二叉树并遍历 基本要求: 该程序集成了如下功能: (1)二叉树的建立 (2)递归和非递归先序,中序和后序遍历二叉树 (3)按层次遍历二叉树 (4)交换二叉树的左右子树 (5)输出叶子结点 (6)递归和非递归计算叶子结点的数目
1.2需求分析 分先序遍历,中序遍历和后序遍历三种情况考虑。 1. 先序遍历,当二叉树非空时按以下顺序遍历,否则结束操作: ① 访问根结点; ② 按先序遍历规则遍历左子树; ③ 按先序遍历规则遍历右子树; 2. 中序遍历,当二叉树非空时按以下顺序遍历,否则结束操作: ① 按中序遍历规则遍历左子树; ② 访问根结点; ③ 按中序遍历规3遍历右子树。 3. 后序遍历,当二叉树非空时按以下顺序遍历,否则结束操作: ① 按后序遍历规则遍历左子树; ② 按后序遍历规则遍历右子树; ③ 访问根结点。 - . - .可修编- 1.3设计容和要求 对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种周游,输出三种周游的结果。
1.4流程图及结构图
图1.1 流程图 开始 i=0 ibtreetypenewNode
Multiplex root=newNode i++
结束
是否为空
returnroot YES
YES NO
NO - . -
.可修编- 图1.2二叉链表存储结构模拟图 2.概要设计 2.1数据结构设计: 1. 二叉树结点数据类型定义为: template struct BiNode { BiNode*rchild,*lchild;//指向左孩子的指针 T data;//结点数据信息 }; 2. 二叉树数据类型定义为: template class BiTree { template friend ostream & operator <<(ostream &os ,BiTree &bt); public: BiTree();//无参构造函数 BiTree(int m){};//有参空构造函数 BiTree(T ary[],int num,T none);//有参构造函数 BiTree();//析构函数
b c d e f
a - . -
.可修编- void preorder();//递归前序遍历 void inorder();//递归中序遍历 void postorder();//递归后续遍历 void levelorder();//层序遍历 int count();//计算二叉树的结点数 void display(ostream &os);//打印二叉树,有层次 void LevelNum();//计算每一层结点数 void PreOrder();//非递归前序遍历 void PostOrder();//非递归后序遍历 void creat();//创建二叉树 protected: //以下函数供上面函数调用 //对应相同功能 Voidcreat(BiNode*&root);//创建 void release(BiNode* &root);//删除 BiNode * Build(T ary[],int num,T none,int idx);//用数组创建二叉树 void PreOrder(BiNode* root);//前序遍历 void PostOrder(BiNode* root);//后续遍历 void LevelNum(BiNode* root);//层序遍历 void preorder(BiNode* root);//递归前序遍历 void inorder(BiNode* root);//递归中序遍历 void postorder(BiNode* root);//递归后续遍历 void levelorder(BiNode*root);//层序遍历 int count(BiNode* root);//计算结点数 void display(ostream& os,BiNode* root,int dep);//打印 static bool leastCommanAncestor(BiNode *root, T va, T vb, BiNode
private:BiNode *rootptr; }; - . -
.可修编- 2.2源程序代码 #include using namespace std; //************************************************************************************* //二叉树结点类的定义 template struct BTNode { T data; BTNode * Lchild,*Rchild; BTNode(T nodeValue = T(),BTNode* leftNode = NULL,BTNode* rightNode = NULL ) :data(nodeValue),Lchild(leftNode),Rchild(rightNode){} //可选择参数的默认构造函数 }; //************************************************************************************** //二叉树的建立 template void createBinTree(BTNode * &root ) { BTNode* p = root; BTNode* k; T nodeValue ; cin>>nodeValue; if(nodeValue==-1) { root=NULL; } - . - .可修编- else { root=new BTNode(); root->data = nodeValue; createBinTree(root->Lchild); createBinTree(root->Rchild); } } //************************************************************************************ //二叉树的先序遍历 template void preOrder( BTNode * & p) { if(p) { coutLchild); preOrder(p->Rchild); } } //************************************************************************************** //二叉树的中序遍历 template void inOrder(BTNode * & p) {
if(p) { inOrder(p->Lchild);