二叉树操作课程设计报告

合集下载

二叉树的各种基本操作实验报告范文

二叉树的各种基本操作实验报告范文

二叉树的各种基本操作实验报告范文a.输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##建立二叉树,实现先序、中序和后序以及按层次遍历序列。

b.求所有叶子及结点总数。

掌握二叉树的存储实现;掌握二叉树的遍历思想;掌握二叉树的常见算法的程序实现。

实目项型验项二叉树的操作目类综合型完成时间2022-11-2实验目的及要求掌握二叉树的存储实现;掌握二叉树的遍历思想;掌握二叉树的常见算法的程序实现。

(实验步骤【实验过程】实验步骤、绘图、记录、数据、分析、结果)实验过程】实验步骤、绘图、记录、数据、分析、结果)(实验内容:实验内容:a.输入完全二叉树的先序序列,用#代表虚结点(空指针)如ABD###CE##F##建,立二叉树,实现先序、中序和后序以及按层次遍历序列。

b.求所有叶子及结点总数。

实验步骤:实验步骤:#include<tdio.h>#include<tdlib.h>#defineMA某10#defineSTACK_INIT_SIZE40//存储空间初始分配量#defineSTACKINCREMENT10//存储空间分配增量typedeftructBiTNode{chardata;tructBiTNode某lchild;tructBiTNode某rchild;}BiTNode,某BiTree;//将BiTree定义为指向二叉链表结点结构的指针类型BiTNode某bt;typedeftruct{BiTree某bae;inttop;inttackize;}SqStack;typedeftruct{BiTree某bae;a.输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##建立二叉树,实现先序、中序和后序以及按层次遍历序列。

b.求所有叶子及结点总数。

掌握二叉树的存储实现;掌握二叉树的遍历思想;掌握二叉树的常见算法的程序实现。

二叉树的操作实验报告

二叉树的操作实验报告

二叉树的操作实验报告二叉树的操作实验报告引言二叉树是计算机科学中常用的数据结构,它具有良好的搜索性能和灵活的插入和删除操作。

本实验旨在通过实际操作,深入理解二叉树的基本操作和特性。

1. 二叉树的定义和基本概念二叉树是一种特殊的树状结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树的节点由数据和指向左右子节点的指针组成。

根据节点的位置,可以将二叉树分为左子树、右子树和根节点。

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

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

前序遍历先访问根节点,然后按照左子树、右子树的顺序遍历;中序遍历先访问左子树,然后根节点,最后右子树;后序遍历先访问左子树,然后右子树,最后根节点。

3. 二叉树的插入操作插入操作是将一个新节点插入到二叉树中的特定位置。

插入操作需要考虑节点的大小关系,小于当前节点则插入到左子树,大于当前节点则插入到右子树。

插入操作可以保持二叉树的有序性。

4. 二叉树的删除操作删除操作是将指定节点从二叉树中删除。

删除操作需要考虑被删除节点的子节点情况,如果被删除节点没有子节点,则直接删除;如果有一个子节点,则将子节点替代被删除节点的位置;如果有两个子节点,则选择被删除节点的后继节点或前驱节点替代被删除节点。

5. 二叉树的查找操作查找操作是在二叉树中搜索指定的节点。

二叉树的查找操作可以使用递归或迭代的方式实现。

递归方式会自动遍历整个二叉树,直到找到目标节点或遍历完整个树。

迭代方式则需要手动比较节点的值,并根据大小关系选择左子树或右子树进行进一步查找。

6. 二叉树的平衡性二叉树的平衡性是指左子树和右子树的高度差不超过1。

平衡二叉树可以提高搜索效率,避免出现极端情况下的性能下降。

常见的平衡二叉树有AVL树和红黑树。

7. 二叉树应用场景二叉树在计算机科学中有广泛的应用场景。

例如,文件系统的目录结构可以使用二叉树来表示;数据库中的索引结构也可以使用二叉树来实现。

二叉树课程设计报告

二叉树课程设计报告

一、设计目标二叉树是形象地说既树中每个节点最多只有两个分支,它是一中重要的数据类型。

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

二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。

以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。

在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。

二、总体设计1.对程序中定义的核心数据结构及对其说明:typedef struct BiTNode{//创建二叉树char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;在开头定义了二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,左指针域和右指针域。

2.模块的划分及其功能:本程序分为:7大模块。

二叉树的建立链式存储结构、前序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。

1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,*lchild:左指针域和rchild:右指针域。

2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:先访问根结点,再依次访问左右子树。

3、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。

4、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左子数,再访问根结点,最后访问右子树。

5、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左右子树,再访问根结点。

6、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度为0。

否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。

7、主函数。

核心算法的设计:二叉树是n个节点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件:(1):有且仅有一个称为根的节点;(2):其余节点分为两个互不相交的集合T1,T2,并且T1,T2都是二叉树,分别称为根的左子树和右子树。

二叉树的基本操作实验报告

二叉树的基本操作实验报告

二叉树的基本操作实验报告学号姓名实验日期 2012-12-26实验室计算机软件技术实验指导教师设备编号 401实验内容二叉树的基本操作一实验题目实现二叉树的基本操作的代码实现二实验目的1、掌握二叉树的基本特性2、掌握二叉树的先序、中序、后序的递归遍历算法3、通过求二叉树的深度、度为2的结点数和叶子结点数等算法三实习要求(1)认真阅读书上给出的算法(2)编写程序并独立调试四、给出二叉树的抽象数据类型ADT BinaryTree{//数据对象D: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,且存在上的关系Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

//基本操作:CreateBiTree( &T, definition ) // 初始条件:definition给出二叉树T的定义。

// 操作结果:按definiton构造二叉树T。

BiTreeDepth( T )// 初始条件:二叉树T存在。

// 操作结果:返回T的深度。

PreOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。

二叉树操作设计和实现实验报告

二叉树操作设计和实现实验报告

二叉树操作设计和实现实验报告一、目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。

二、要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

三、实验内容:1、分析、理解程序程序的功能是采用二叉树链表存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作。

如输入二叉树ABD###CE##F##,链表示意图如下:2、添加中序和后序遍历算法//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}3、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

(1)输入完全二叉树的先序序列ABD###CE##F##,程序运行结果如下:(2)先序序列:(3)中序序列:(4)后序序列:(5)所有叶子及结点总数:(6)按层次遍历序列:四、源程序代码#include"stdio.h"#include"string.h"#include"stdlib.h"#define Max 20 //结点的最大个数typedef struct node{char data;struct node *lchild,*rchild;}BinTNode; //自定义二叉树的结点类型typedef BinTNode *BinTree; //定义二叉树的指针int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数//==========基于先序遍历算法创建二叉树==============//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void){BinTree T;char ch;if((ch=getchar())=='#')return(NULL); //读入#,返回空指针else{T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点T->data=ch;T->lchild=CreatBinTree(); //构造左子树T->rchild=CreatBinTree(); //构造右子树return(T);}}//========NLR 先序遍历=============void Preorder(BinTree T){if(T) {printf("%c",T->data); //访问结点Preorder(T->lchild); //先序遍历左子树Preorder(T->rchild); //先序遍历右子树}}//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法======== int TreeDepth(BinTree T){int hl,hr,max;if(T){hl=TreeDepth(T->lchild); //求左深度hr=TreeDepth(T->rchild); //求右深度max=hl>hr? hl:hr; //取左右深度的最大值NodeNum=NodeNum+1; //求结点数if(hl==0&&hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。

二叉树基本操作--实验报告

二叉树基本操作--实验报告

实验三二叉树的基本操作学院:物理与电子学院班级:电信1105班姓名:刘岩学号:29一、实验目的1、熟悉二叉树的基本操作,掌握二叉树的实现以及实际应用。

3、加深对于二叉树的理解,逐步培养解决实际问题的编程能力。

二、实验环境1台WINDOWS环境的PC机,装有Visual C++ 。

三、实验内容1、问题描述现需要编写一套二叉树的操作函数,以便用户能够方便的利用这些函数来实现自己的应用。

其中操作函数包括:1>创建二叉树CreateBTNode(*b,*str):根据二叉树括号表示法的字符串*str生成对应的链式存储结构。

2>输出二叉树DispBTNode(*b):以括号表示法输出一棵二叉树。

3>查找结点FindNode(*b,x):在二叉树b中寻找data域值为x的结点,并返回指向该结点的指针。

4>求高度BTNodeDepth(*b):求二叉树b的高度。

若二叉树为空,则其高度为0;否则,其高度等于左子树与右子树中的最大高度加l。

5>求二叉树的结点个数NodesCount(BTNode *b)6>先序遍历的递归算法:void PreOrder(BTNode *b)7>中序遍历的递归算法:void InOrder(BTNode *b)8>后序遍历递归算法:void PostOrder(BTNode *b)9>层次遍历算法void LevelOrder(BTNode *b)2、基本要求实现以上9个函数。

主函数中实现以下功能:创建下图中的树b输出二叉树b找到’H’节点,输出其左右孩子值输出b的高度输出b的节点个数输出b的四种遍历顺序3、程序编写上图转化为二叉树括号表示法为A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))程序:#include <>#include <>#define MaxSize 100typedef char ElemType;typedef struct node{ElemType data;/*数据元素*/ s truct node *lchild;/*指向左孩子*/ s truct node *rchild;/*指向右孩子*/} BTNode;void CreateBTNode(BTNode *&b,char *str);//创建BTNode *FindNode(BTNode *b,ElemType x);//查找节点int BTNodeHeight(BTNode *b);//求高度void DispBTNode(BTNode *b);//输出int NodesCount(BTNode *b);//二叉树的结点个数void PreOrder(BTNode *b);//先序遍历递归void InOrder(BTNode *b);//中序遍历递归void PostOrder(BTNode *b);//后序遍历递归void LevelOrder(BTNode *b);//层次遍历//创建void CreateBTNode(BTNode *&b,char *str){IB TNode *St[MaxSize],*p=NULL;i nt top=-1,k,j=0;c har ch;b=NULL;c h=str[j];w hile(ch!='\0'){switch(ch){case '(':top++;St[top]=p;k=1;break;case ')':top--;break;case ',':k=2;break;default:p=(BTNode *)malloc(sizeof(BTNode));p->data=ch;p->lchild=p->rchild=NULL;if(b==NULL)b=p;else{switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}}//输出void DispBTNode(BTNode *b){if(b!=NULL){printf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL)printf(",");DispBTNode(b->rchild);printf(")");}}}//查找节点BTNode *FindNode(BTNode *b,ElemType x){B TNode *p;i f(b==NULL)return b;e lse if(b->data==x)return b;e lse{p=FindNode(b->lchild,x);if(p!=NULL)return p;elsereturn FindNode(b->rchild,x);}}//求高度int BTNodeHeight(BTNode *b){int lchildh,rchildh;if(b==NULL)return (0);else{lchildh=BTNodeHeight(b->lchild);rchildh=BTNodeHeight(b->rchild);return(lchildh>rchildh)(lchildh+1):(rchildh+1);}}//二叉树的结点个数int NodesCount(BTNode *b){if(b==NULL)return 0;elsereturn NodesCount(b->lchild)+NodesCount(b->rchild)+1; }//先序遍历递归v oid PreOrder(BTNode *b){if(b!=NULL){printf("%c",b->data);PreOrder(b->lchild);PreOrder(b->rchild);}}//中序遍历递归v oid InOrder(BTNode *b){if(b!=NULL){InOrder(b->lchild);printf("%c",b->data);InOrder(b->rchild);}}//后序遍历递归v oid PostOrder(BTNode *b){if(b!=NULL){PostOrder(b->lchild);PostOrder(b->rchild);printf("%c",b->data);}}//层次遍历void LevelOrder(BTNode *b){BTNode *p;BTNode *qu[MaxSize];int front,rear;front=rear=-1;rear++;qu[rear]=b;while(front!=rear){front=(front+1)%MaxSize;p=qu[front];printf("%c",p->data);if(p->lchild!=NULL){rear=(rear+1)%MaxSize;qu[rear]=p->lchild;}if(p->rchild!=NULL){rear=(rear+1)%MaxSize;qu[rear]=p->rchild;}}}void main(){B TNode *b,*p,*lp,*rp;c har str[]="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))";//根据树形图改写成的//二叉树括号表示法的字符串*str//char str[100];scanf("%s",&str);//自行输入括号表示的二叉树C reateBTNode(b,str); //创建树bp rintf("\n");printf("输出二叉树:");//输出二叉树bD ispBTNode(b);p rintf("\n");p rintf("'H'结点:");//找到'H'节点,输出其左右孩子值p=FindNode(b,'H');p rintf("\n");i f (p!=NULL){printf("左孩子节点的值");printf("%c",p->lchild->data);printf("\n");printf("右孩子节点的值");printf("%c",p->rchild->data);printf("\n");//此处输出p的左右孩子节点的值}p rintf("\n");p rintf("二叉树b的深度:%d\n",BTNodeHeight(b));//输出b的高度p rintf("二叉树b的结点个数:%d\n",NodesCount(b));//输出b的节点个数p rintf("\n");p rintf(" 先序遍历序列:\n");//输出b的四种遍历顺序p rintf(" 算法:");PreOrder(b);printf("\n");p rintf(" 中序遍历序列:\n");p rintf(" 算法:");InOrder(b);printf("\n");p rintf(" 后序遍历序列:\n");p rintf(" 算法:");PostOrder(b);printf("\n");printf(" 层次遍历序列:\n");p rintf(" 算法:");LevelOrder(b); printf("\n");}四、实验心得与小结通过本次实验,我熟悉二叉树的基本知识内容,对课本的知识有了更加深刻的理解与掌握掌握。

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

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

课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (3)二、原理分析及流程 (3)2.1、原理分析 (3)2.2、流程图 (4)1、main()函数 (4)2、创建 (4)3、插入 (5)4、查找 (6)5、中序遍历输出 (7)三、算法描述 (8)3.1、存储结构 (8)3.2、插入算法 (8)3.3、查找算法 (9)3.4、删除算法 (10)四、小结与体会 (12)五、程序执行过程 (13)5.1、创建二叉排序树并中序输出 (13)5.2、插入并中序输出 (13)5.3、查找 (14)六、程序清单 (14)一、课程设计简介1.1、题目:二叉排序树相关操作1、创建二叉排序树;2、插入给定值;3、查找给定值;4、删除给定值的结点。

1.2、报告要求:1、封面;2、题目与流程图或模块图;3、程序清单和运行结果;4、小结(收获和体会);5、装订成册。

1.3、目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

提高学生适应实际,实践编程的能力。

二、原理分析及流程2.1、原理分析:根据题目要求,要实现这些功能,就必须创建一个菜单。

这个菜单设置在main()函数里面,然后使用while()...switch()语句进行循环调用相关函数,以达到实现相关功能的目的。

2.2、流程图:1、main()函数:23、插入:4、查找:5、中序遍历输出:三、算法描述3.1、存储结构定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:#include <stdio.h>#define null 0typedef int keytype;typedef struct node{keytype key;struct node *lchild,*rchild;}bstnode,*bstree;3.2、插入算法在二叉排序树中插入一个新节点,首先要查找该节点在二叉排序树中是否已经存在。

二叉树操作 实验报告

二叉树操作 实验报告

实验报告
课程名称:《计算机软件基础》
实验类型:设计型(验证型、创新型、综合型、设计型)
实验项目名称:二叉树操作
学生姓名:专业:教育技术学学号:
指导老师:
实验地点:软件实验室实验学时: 2 学时
一、实验目的和要求
目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。

要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作
二、主要仪器设备或者软件
1.软件:操作系统和C语言系统。

2.硬件:一台微型计算机
三、操作方法与实验步骤
操作方法:
1、分析、理解程序。

2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结
点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

实验步骤:
1.基于先序遍历算法创建二叉树
2.要求输入先序序列,其中加入虚结点“#”以示空指针的位置
3.NLR先序遍历
4.LNR中序遍历
5.LRN后序遍历
1.采用后序遍历求二叉树的深度,结点数及叶子树的递归算法
2.利用“先进先出”(FIFO)队列,按层次遍历二叉树
四、 讨论或心得
通过对树和二叉树的各种操作,我知道了一般的树和二叉树的区别,认识了结点,知道了包括前序遍历、中序遍历和后序遍历是针对根结点而言的,这正是以前所迷茫的。

五、画出设计的二叉树
执行踪迹(后序遍历):
4 2
5 3 1
五、 实验结果
先序遍历:1 2 4 3 5
中序遍历:4 2 1 3 5
后序遍历:4 2 5 3 1。

二叉排序树课程设计

二叉排序树课程设计

二叉排序树课程设计一、课程目标知识目标:1. 学生能够理解二叉排序树的基本概念和性质,掌握其结构特点和应用场景。

2. 学生能够掌握二叉排序树的插入、删除和查找操作,并了解其时间复杂度。

3. 学生能够理解二叉排序树与其他排序算法的关系,了解其在排序中的应用。

技能目标:1. 学生能够运用所学知识,独立构建二叉排序树,并实现插入、删除和查找功能。

2. 学生能够分析二叉排序树的性能,对其进行优化,提高排序效率。

3. 学生能够运用二叉排序树解决实际问题,如数据排序、查找等。

情感态度价值观目标:1. 学生通过学习二叉排序树,培养对数据结构和算法的兴趣,提高解决问题的能力。

2. 学生在学习过程中,学会合作、交流,培养团队精神和共享意识。

3. 学生能够认识到二叉排序树在实际应用中的价值,激发对计算机科学的热爱。

本课程针对高中年级学生,课程性质为理论与实践相结合。

在教学过程中,注重启发式教学,引导学生主动探究、实践。

根据学生特点和教学要求,课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。

课程目标的分解为具体的学习成果,为后续的教学设计和评估提供依据。

二、教学内容1. 引入二叉排序树的概念,讲解其定义、性质和基本操作。

- 理解二叉树的基础知识,回顾二叉树的遍历方法。

- 介绍二叉排序树的定义,阐述其特点及应用场景。

- 分析二叉排序树的性质,如二叉排序树的中序遍历结果为有序序列。

2. 探讨二叉排序树的构建、插入、删除和查找操作。

- 讲解二叉排序树的构建方法,学会从无序数据建立二叉排序树。

- 分析插入、删除和查找操作的步骤,理解它们的时间复杂度。

- 举例说明如何利用二叉排序树实现数据排序和查找。

3. 分析二叉排序树的性能及优化方法。

- 探讨二叉排序树的高度、平衡因子等性能指标。

- 介绍常见的优化方法,如平衡二叉树(AVL树)和红黑树。

4. 实践环节:二叉排序树的应用。

- 设计实践题目,让学生动手实现二叉排序树的基本操作。

二叉排序树课程设计

二叉排序树课程设计

二叉排序树课程设计一、课程目标知识目标:1. 理解二叉排序树的概念和特点;2. 掌握二叉排序树的插入、删除和查找操作;3. 能够分析二叉排序树的时间复杂度;4. 了解二叉排序树在实际应用中的优势。

技能目标:1. 能够手动构建二叉排序树并进行基本操作;2. 能够运用编程语言实现二叉排序树的基本功能;3. 能够分析并解决二叉排序树相关的问题;4. 能够运用二叉排序树解决实际排序和查找问题。

情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情;2. 培养学生的逻辑思维能力和问题解决能力;3. 培养学生的团队协作意识,学会与他人共同分析、解决问题;4. 培养学生严谨的科学态度,注重算法的正确性和效率。

课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在让学生掌握二叉排序树的基本概念和操作,提高学生的编程能力和逻辑思维能力。

学生特点:学生具备基本的计算机知识和编程基础,对数据结构有一定了解,但对二叉排序树的认识可能较浅。

教学要求:结合学生特点,采用讲解、实践和讨论相结合的教学方法,使学生在理解二叉排序树理论知识的基础上,能够动手实践并解决实际问题。

在教学过程中,注重培养学生的自主学习能力和团队合作精神,提高学生的综合素质。

通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程打下坚实基础。

二、教学内容1. 引入二叉排序树的概念,阐述其定义、性质和应用场景;- 教材章节:第三章第一节“二叉排序树的定义和性质”2. 讲解二叉排序树的插入、删除、查找操作及其实现方法;- 教材章节:第三章第二节“二叉排序树的操作”3. 分析二叉排序树的性能特点,包括时间复杂度和空间复杂度;- 教材章节:第三章第三节“二叉排序树的性能分析”4. 介绍二叉排序树在实际应用中的优势,如排序、查找等;- 教材章节:第三章第四节“二叉排序树的应用”5. 结合实例,让学生动手实践二叉排序树的构建和操作;- 教材章节:第三章实例分析与编程练习6. 总结二叉排序树的特点和适用场景,与其他排序方法进行对比;- 教材章节:第三章总结与拓展教学进度安排:1. 第1课时:引入二叉排序树的概念、性质和应用场景;2. 第2课时:讲解二叉排序树的插入、删除、查找操作;3. 第3课时:分析二叉排序树的性能特点;4. 第4课时:介绍二叉排序树在实际应用中的优势;5. 第5课时:结合实例,学生动手实践二叉排序树的构建和操作;6. 第6课时:总结二叉排序树,与其他排序方法进行对比。

二叉树的基本操作与实现实验报告

二叉树的基本操作与实现实验报告

二叉树的基本操作与实现实验报告二叉树是一种重要的数据结构,在计算机科学领域中被广泛应用。

本实验将介绍二叉树的基本操作与实现,并给出相应的实验报告。

一、引言二叉树是一种特殊的树状结构,每个节点至多有两个子节点。

二叉树有许多重要的特性,如平衡二叉树、二叉树等,应用广泛。

在本实验中,我们将介绍二叉树的基本操作和实现。

二、实验目的1.掌握二叉树的基本概念和特性;2.熟悉二叉树的基本操作,包括创建、插入、删除、遍历等;3.学会使用编程语言实现二叉树的基本操作。

三、实验内容本实验主要包括以下内容:1.二叉树的定义和基本概念;2.二叉树的基本操作,包括创建、插入、删除、遍历等;3.使用编程语言实现二叉树的基本操作;4.测试和验证二叉树的基本操作的正确性。

四、实验步骤1.二叉树的定义和基本概念二叉树是一种树状结构,每个节点至多有两个子节点。

二叉树的每个节点包含一个数据项和指向左子树和右子树的指针。

二叉树的特性有很多,如完全二叉树、平衡二叉树、二叉树等。

2.二叉树的基本操作(1)创建二叉树:可以通过手动输入节点数据来创建二叉树,也可以通过读取文件中的数据来创建二叉树。

(2)插入节点:在指定位置插入一个新节点。

(3)删除节点:删除指定位置的节点。

(4)遍历二叉树:有前序遍历、中序遍历和后序遍历三种遍历方式。

3.使用编程语言实现二叉树的基本操作实现二叉树的基本操作可以使用编程语言来完成。

我们可以定义一个二叉树的结构体,包含节点数据和指向左右子树的指针。

然后根据具体的需求,实现相应的操作函数。

4.测试和验证二叉树的基本操作的正确性在完成二叉树的基本操作后,我们可以编写测试代码来验证操作的正确性。

通过创建二叉树,并进行插入、删除和遍历操作,观察输出结果是否符合预期。

五、实验结果与分析在完成二叉树的基本操作后,我们可以进行测试和验证。

通过输出二叉树的遍历结果,比对预期结果来判断操作是否正确。

同时,我们还可以观察二叉树的结构和特性,如是否满足平衡二叉树或二叉树的条件。

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

数据结构实验报告6二叉树的操作
S.pop();
if(!S.empty())
{
p=S.top();
S.pop();
cout<<p->data<<" ";
S.push(p->rchild);
}}
}
void PreOrder_Nonrecursive(BiTree T)
{
stack<BiTree> S;
BiTree p;
S.push(T);
#include <queue>
#include <stack>
#include <malloc.h>
#defineSIZE 100
using namespace std;
typedef struct BiTNode
{char data;
struct BiTNode *lchild,*rchild;
break;
default:flag=0;printf("程序运行结束,按任意键退出!\n");
}}
}
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{ T=(BiTNode *)malloc(sizeof(BiTNode));
PreOrder_Nonrecursive(T);
printf("\n");
}
else printf("二叉树为空!\n");
break;

二叉树的基本操作实验报告

二叉树的基本操作实验报告

二叉树的基本操作实验报告二叉树的基本操作实验报告引言:二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。

二叉树的基本操作包括创建、遍历、插入和删除等。

本实验旨在通过实践来深入了解二叉树的基本操作,并通过实验结果验证其正确性和有效性。

一、创建二叉树创建二叉树是二叉树操作中的第一步。

在本实验中,我们使用了递归算法来创建二叉树。

递归算法是一种重要的算法思想,通过将问题划分为更小的子问题来解决复杂的问题。

在创建二叉树时,我们首先创建根节点,然后递归地创建左子树和右子树。

二、遍历二叉树遍历二叉树是对二叉树中的每个节点进行访问的过程。

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

前序遍历先访问根节点,然后递归遍历左子树和右子树;中序遍历先递归遍历左子树,然后访问根节点,最后递归遍历右子树;后序遍历先递归遍历左子树和右子树,最后访问根节点。

三、插入节点插入节点是向二叉树中添加新节点的操作。

插入节点的过程需要遵循二叉树的特性,即左子节点的值小于父节点的值,右子节点的值大于父节点的值。

在插入节点时,我们需要找到合适的位置,将新节点插入到正确的位置上。

四、删除节点删除节点是从二叉树中移除节点的操作。

删除节点的过程相对复杂,需要考虑多种情况。

如果要删除的节点是叶子节点,直接删除即可。

如果要删除的节点只有一个子节点,将其子节点连接到父节点上。

如果要删除的节点有两个子节点,我们需要找到其后继节点或前驱节点来替代被删除的节点。

实验结果:通过实验,我们成功地实现了二叉树的基本操作。

创建二叉树的递归算法能够正确地创建出符合要求的二叉树。

遍历二叉树的算法能够按照指定的顺序遍历每个节点。

插入节点和删除节点的操作也能够正确地修改二叉树的结构。

讨论与总结:二叉树的基本操作是数据结构中的重要内容,对于理解和应用其他数据结构具有重要意义。

通过本次实验,我们深入了解了二叉树的创建、遍历、插入和删除等操作,并通过实验验证了其正确性和有效性。

数据结构实验报告(二叉树的基本操作)

数据结构实验报告(二叉树的基本操作)
else if((root->LChild==NULL)&&(root->RChild==NULL)) LeafNum=1;
else LeafNum=LeafCount(root->LChild)+LeafCount(root->RChild);
//叶子数为左右子树数目之和
return LeafNum;
printf("\n菜单选择\n\n");
printf(" 1.树状输出二叉树2.先序遍历二叉树\n");
printf(" 3.中序遍历二叉树4.后序遍历二叉树\n");
printf(" 5.输出叶子结点6.输出叶子结点的个数\n");
printf(" 7.输出二叉树的深度8.退出\n");
printf("\n----------------------------------------------------------------------\n");
{
printf("\n\n");
j=j+1; k=0;
while(k<nlocate)
{
printf(" ");
k++;
}
}
while(k<(nlocate-1))
{
printf(" ");
k++;
}
printf("%c",bt->data );
q.front=q.front+1;
if(bt->LChild !=NULL)//存在左子树,将左子树根节点入队列

二叉树操作实验报告

二叉树操作实验报告

二叉树操作实验报告一、实验背景二叉树是一种常用的数据结构,它由节点和连接节点的边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

在二叉树的操作中,常用的操作包括创建二叉树、插入节点、删除节点、查找节点、遍历等。

本次实验旨在通过对二叉树的操作,加强对二叉树数据结构的理解,并熟练掌握其操作方法。

二、实验目的1.掌握二叉树的创建方法,能够编写代码创建一个二叉树;2.了解二叉树的插入节点操作,掌握节点的插入方法;3.掌握二叉树的删除节点操作,了解节点删除的细节和方法;4.熟练掌握二叉树的查找节点操作;5.掌握二叉树的遍历方法,能够实现对二叉树的前序、中序、后序、层次遍历。

三、实验原理1.二叉树的创建方法:通过递归的方式,先创建根节点,再依次创建左子树和右子树;2.二叉树的插入节点操作:从根节点开始,根据节点值的大小关系,将待插入节点放到适当的位置;3.二叉树的删除节点操作:首先查找待删除的节点,然后根据其子节点的情况,进行相应的删除处理;4.二叉树的查找节点操作:从根节点开始遍历,根据节点值的大小关系,在左子树或右子树中继续查找,直到找到目标节点或遍历到叶子节点;5.二叉树的遍历方法:前序遍历先访问根节点,再遍历左子树和右子树;中序遍历先遍历左子树,再访问根节点和右子树;后序遍历先遍历左子树和右子树,再访问根节点;层次遍历按层次逐个访问节点。

四、实验过程1.创建二叉树:首先,定义二叉树的节点类,包含节点值和左右子节点;然后,通过递归的方式创建根节点、左子树和右子树。

2.插入节点:要插入一个节点,首先需要找到插入位置。

如果待插入节点大于当前节点的值,则插入到右子树中,否则插入到左子树中。

如果节点为空,则表示找到了插入位置。

3.删除节点:删除节点有以下几种情况:(1) 待删除节点为叶子节点:直接删除即可;(2) 待删除节点只有一个子节点:用子节点替换待删除节点的位置;(3) 待删除节点有两个子节点:找到待删除节点的后继节点(右子树的最左下角节点),用后继节点替换待删除节点的位置。

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

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

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

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

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

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

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

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

目录................................................. 错误!未定义书签。

一、需求分析................................................. 错误!未定义书签。

1.问题描述.............................................. 错误!未定义书签。

2.功能要求.............................................. 错误!未定义书签。

二、概要设计................................................. 错误!未定义书签。

1.总体设计图............................................. 错误!未定义书签。

二叉排序树的操作课程设计报告

二叉排序树的操作课程设计报告

然后返回主菜单。 BSTree *SearchKey(root,key) 初始条件:二叉排序树不为空,存在根节点; 操作结果:输入一个字符型数据,先寻找二叉排序树中是否有此数 据的,有则返回次数据项的地址给指针变量,没有则就返回该数据按照 二叉排序树规则,应该插入位置的父节点地址。 void DeleteKey(root,key); 初始条件:二叉排序树不为空,存在根节点; 操作结果:输入一个字符型数据,调用BSTree *SearchKey(root,key)函数,先寻找二叉排序树中是否有此数据的,有 则返回次数据项的地址给指针变量,然后就此节点的特征分为四类:删 除叶子节点;删除只有右孩子的节点;删除只有左孩子的节点;删除左 右孩子都有的节点,根据结点类型进入不同删除模块,删除结点,修改 相应二叉树结点指针,返回主菜单;没有则就返回提示语句“没有找到 该数据”。 void ChainTree_LDR(root) 初始条件:二叉排序树不为空,存在根节点; 操作结果:按照中序遍历并输出有序的数据序列。 } ADT BT
.4 功能需求
创建二叉排序树 输出二叉排序树 在二叉排序树中查找给定值 在二叉排序树中插入新结点 在二叉排序树中删除给定值 并设计主函数测试该类(或类模板)。
.5 任务计划
主程序流程图 算法:主程序主要用运了switch结构,使得主程序更加方便的调用成员 函数,各个成员函数间的关系也清晰明了。
输入与功能相对应的序号 执行功能 是否存在 开始 结束
.2 添加模块设计
if(root==NULL) { cout<<"空树!!!禁止操作!!!"; cout<<endl; } else{ cout<<"请输入你要添加的结点数目:"; cin>>n; fflush(stdin); for(i=0;i<n;i++) { cout<<"请输入你要添加的结点数据:"; cin>>key; a.Inserter(root,key); fflush(stdin); } }

二叉树实现及应用实验报告

二叉树实现及应用实验报告

二叉树实现及应用实验报告实验名称:二叉树实现及应用实验目的:1. 实现二叉树的创建、插入和删除操作。

2. 学习二叉树的遍历方法,并能够应用于实际问题。

3. 掌握二叉树在数据结构和算法中的一些常用应用。

实验内容:1. 实现二叉树的创建、插入和删除操作,包括二叉树的构造函数、插入函数和删除函数。

2. 学习二叉树的三种遍历方法:前序遍历、中序遍历和后序遍历,并应用于实际问题。

3. 掌握二叉树的一些常用应用,如二叉搜索树、平衡二叉树和哈夫曼树等。

实验步骤:1. 创建二叉树的结构体,包括树节点和树的根节点。

2. 实现二叉树的构造函数,用于创建二叉树的根节点。

3. 实现二叉树的插入函数,用于将元素插入到二叉树中的合适位置。

4. 实现二叉树的删除函数,用于删除二叉树中的指定元素。

5. 学习并实现二叉树的前序遍历、中序遍历和后序遍历函数。

6. 运用二叉树的遍历方法解决实际问题,如查找二叉树中的最大值和最小值。

7. 学习并应用二叉搜索树、平衡二叉树和哈夫曼树等常用二叉树结构。

实验结果:1. 成功创建、插入和删除二叉树中的元素,实现了二叉树的基本操作。

2. 正确实现了二叉树的前序遍历、中序遍历和后序遍历,并能够正确输出遍历结果。

3. 通过二叉树的遍历方法成功解决了实际问题,如查找二叉树中的最大值和最小值。

4. 学习并熟练应用了二叉搜索树、平衡二叉树和哈夫曼树等常用二叉树结构,丰富了对二叉树的理解。

实验分析:1. 二叉树是一种重要的数据结构,具有较好的数据存储和查找性能,广泛应用于计算机科学和算法领域。

2. 通过实验,我们深入了解了二叉树的创建、插入和删除操作,以及前序遍历、中序遍历和后序遍历的原理和应用。

3. 实际问题往往可以转化为二叉树的遍历问题进行求解,通过实验,我们成功应用了二叉树的遍历方法解决了实际问题。

4. 熟练掌握二叉搜索树、平衡二叉树和哈夫曼树的原理和应用,对于提高我们在数据结构和算法方面的设计能力具有重要意义。

数据结构课程设计-二叉树的基本操作

数据结构课程设计-二叉树的基本操作

二叉树的基本操作摘要:本次课程设计通过对二叉树的一系列操作主要练习了二叉树的建立、四种遍历方式:先序遍历、中序遍历、后序遍历和层序遍历以及节点数和深度的统计等算法。

增加了对二叉树这一数据结构的理解,掌握了使用c语言对二叉树进行一些基本的操作。

关键字:递归、二叉树、层序遍历、子树交换一、程序简介本程序名为“二叉树基本操作的实现”,其主要为练习二叉树的基本操作而开发,其中包含了建立、遍历、统计叶子结点和深度等一系列操作。

其中定义二叉链表来表示二叉树,用一个字符类型的数据来表示每一个节点中存储的数据。

由于没有进行图形界面的设计,用户可以通过程序中的遍历二叉树一功能来查看操作的二叉树。

二、功能模块2.1功能模块图2.2功能模块详解2.2.1建立二叉树输入要建立的二叉树的扩展二叉树的先序遍历序列,来建立二叉树,建立成功会给出提示。

2.2.2遍历二叉树执行操作之后会有四个选项可供选择:先序遍历、中序遍历、后序遍历、层序遍历。

输入对应的序号即可调动相关函数输出相应的遍历序列。

2.2.3统计叶子节点树执行之后输出叶子结点的个数。

2.2.4求二叉树深度执行之后输出二叉树的深度。

2.2.5子树交换交换成功则会给出提示,用户可通过遍历二叉树来观察子树交换之后的二叉树。

三、数据结构和算法设计3.1二叉链表的设计1.typedef struct BiNode {2.char data;3.struct BiNode* lchild; //左孩子4.struct BiNode* rchild; //右孩子5.}BiTree;用一个字符型保存节点数据,分别定义两个struct BiNode类型的指针来指向左孩子和右孩子。

在BiTree.h中实现相关的功能。

3.2队列的实现1.typedef struct {2. ElemType* data;3.int head;//队头指针4.int tail;//队尾指针5.} SqQueue;队列主要用于二叉树遍历过程中的层序遍历,从根节点开始分别将左右孩子放入队列,然后从对头开始输出。

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

二叉树操作课程设计报告一、总体设计1、程序功能简介带枚举值的二叉树的实现,利用枚举值使二叉树的组成尽量平衡,即左右子树的级数相差不多。

可以完成二叉树结点数据的插入、删除、查找和输出等功能。

2、程序设计要求(1)仔细阅读程序,回答下列问题a.枚举值Red和Black在程序中起什么作用,Red的结点和Black的结点有什么区别?b.一个结点的左右子树最多可以相差几级?为什么?c.程序是通过哪些函数来调整二叉树左右子树的结构,举例说明如何调整。

(2)增加对二叉树上结点中的数据进行由大到小排序的函数。

(3)增加对二叉树上结点中的数据进行由小到大排序的函数。

(4)增加计算二叉树中结点上数据的平均值的函数。

(5)修改main函数,增加菜单选项,使得用户可以通过键盘反复输入命令或数值查看运行结果。

评定难易等级:A级二、详细设计1、对二叉树的初步了解(1)本题中的二叉树是一颗二叉查找树,首先应具有二叉查找树的特征。

它或者是一棵空树;或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。

且结点上数据互不相同。

如图所示:(2)本题中的二叉树同时为平衡二叉树中的一类——红黑树,因此它具有红黑树的特征。

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。

在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。

性质2. 根节点是黑色。

性质3 每个叶节点是黑色的。

性质4 每个红色节点的两个子节点都是黑色。

(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。

要知道为什么这些特性确保了这个结果,注意到性质4导致了路径不能有两个毗连的红色节点就足够了。

最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。

因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。

(3)由于红黑树性质的约束,在红黑树上只读操作不需要对用于二叉查找树的操作做出修改,因为它也是二叉查找树。

但是,在插入和删除之后,红黑属性可能变得违规。

恢复红黑属性需要少量(O(log n))的颜色变更(这在实践中是非常快速的)并且不超过三次树旋转(对于插入是两次)。

这允许插入和删除保持为O(log n) 次,但是它导致了非常复杂的操作。

插入我们首先以二叉查找树的方法增加节点并标记它为红色。

(如果设为黑色,就会导致根到叶子的路径上有一条路上,多一个额外的黑节点,这个是很难调整的。

但是设为红色节点后,可能会导致出现两个连续红色节点的冲突,那么可以通过颜色调换(color flips)和树旋转来调整。

)下面要进行什么操作取决于其他临近节点的颜色。

同人类的家族树中一样,我们将使用术语叔父节点来指一个节点的父节点的兄弟节点。

注意:性质1和性质3总是保持着。

性质4只在增加红色节点、重绘黑色节点为红色,或做旋转时受到威胁。

性质5只在增加黑色节点、重绘红色节点为黑色,或做旋转时受到威胁。

在下面的示意图中,将要插入的节点标为N ,N 的父节点标为P ,N 的祖父节点标为G ,N 的叔父节点标为U 。

在图中展示的任何颜色要么是由它所处情形所作的假定,要么是这些假定所暗含 (imply) 的。

int RBtree<T>::NodeInsert(RBnode *x){ RBnode *tmp1=ROOT,*tmp2=tmp1;if(ROOT==NIL) { ROOT=x;x ->left=x ->right=x ->p=NIL;++alive;return 0;}while((tmp1!=NIL)&&(tmp1->value!=x ->value)) { tmp2=tmp1;tmp1=x ->value>tmp1->value?tmp1- }if(tmp1==NIL){ if(x ->value>tmp2->value) tmp2->right=x;elsetmp2->left=x;x->p=tmp2;x->left=x->right=NIL;++alive;return 0;}return 1;}void RBtree<T>::Insert(const T&val){ RBnode *x=new RBnode(val),*y; 用数值生成新结点if(NodeInsert(x)==1){ cout<<val<<"alread exist in tree"<<endl;return;}while((x!=ROOT)&&(x->p->color==Red)) {if(x->p==x->p->p->left){ y=x->p->p->right;if(y->color==Red){ x->p->color=Black;y->color=Black;情形3: 如果父节点P和叔父节点U二者都是红色,则我们可以将它们两个重绘为黑色并重绘祖父节点G为红色(用来保持性质5)。

现在我们的新节点N有了一个黑色的父节点P。

因为通过父节点P或叔父节点U的任何路径都必定通过祖父节点G,在这些路径上的黑节点数目没有改变。

x->p->p->color=Red; x=x->p->p;}else{if(x==x->p->right){ x=x->p;RotateLeft(x);}x->p->color=Black;x->p->p->color=Red;RotateRight(x->p->p); }}else{ y=x->p->p->left;if(y->color==Red){ x->p->color=Black;y->color=Black;x->p->p->color=Red;x=x->p->p;}情形4: 父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的右子节点而父节点P又是其父节点的左子节点。

在这种情形下,我们进行一次左旋转调换新节点和其父节点的角色。

情形3: 如果父节点P和叔父节点U二者都是红色,则我们可以将它们两个重绘为黑色并重绘祖父节点G为红色(用来保持性质5)。

现在我们的新节点N有了一个黑色的父节点P。

因为通过父节点P或叔父节点U的任何路径都必定通过祖父节点G,在这些路径上的黑节点数目没有改变。

{ if(x==x ->p ->left) { x=x ->p; RotateRight(x); }x ->p ->color=Black; x ->p ->p ->color=Red;RotateLeft(x ->p ->p);}}}ROOT ->color=Black;cout<<"插入数据-----"<<val<<endl; //微调Insert()函数 return; } 删除void RBtree<T>::Delete(const T&val) { RBnode *z,*y,*x; z=RBFind(val); if(z==NIL){ cout<<val<<"not found"<<endl;情形5: 父节点P 是红色而叔父节点U 是黑色或缺少,新节点N 是其父节点的左子节点,而父节点P 又是其父节点G 的左子节点。

在这种情形下,我们进行针对祖父节点G 的一次右旋转。

情况 1: N 是新的根。

在这种情况下,我们就做完了。

我们从所有路径去除了一个黑色节点,而新根是黑色的,所以属性都保持着。

}--alive;if((z->left==NIL)||(z->right==NIL))y=z;elseif(y->left!=NIL)x=y->left;elsex=y->right;x->p=y->p;if(y->p==NIL){ ROOT=x;x->p=NIL;}else{ if(y==y->p->left)y->p->left=x;elsey->p->right=x;}if(y!=z)z->value=y->value;if(y->color==Black)FixDel(x);delete y;if(x==NIL)x->p=NIL;cout<<"删除数据-----"<<val<<endl; //微调Delete()函数return;}void RBtree<T>::RotateLeft(RBnode *x){ RBnode *y=x->right;if(y->left!=NIL)y->left->p=x;y->p=x->p;if(x->p==NIL)ROOT=y;else if(x==x->p->left)x->p->left=y;elsex->p->right=y;y ->left=x; x ->p=y; return; }void RBtree<T>::RotateRight(RBnode *x){ RBnode *y=x ->left; x ->left=y ->right; if(y ->right!=NIL)y ->right ->p=x;y ->p=x ->p; if(x ->p==NIL)ROOT=y;else if(x==x ->p ->right)x ->p ->right=y;elsex ->p ->left=y;y ->right=x; x ->p=y; return; }template<class T>void RBtree<T>::FixDel(RBnode *x){ RBnode *w;while((x!=ROOT)&&(x ->color==Black)) { if(x==x ->p ->left) { w=x ->p ->right; if(w ->color==Red) { w ->color=Black; x ->p ->color=Red; RotateLeft(x ->p);w=x ->p ->right;}if((w ->left ->color==Black)&&(w ->right ->color==Black)) { w ->color=Red; x=x ->p; } else { if(w ->right ->color==Black) { w ->left ->color=Black; w ->color=Red; RotateRight(w);w=x ->p ->right;情况 3: N 的父亲、S 和 S 的儿子都是黑色的。

相关文档
最新文档