数据结构课程设计---二叉排序树和平衡二叉树的判别

合集下载

平衡二叉树和二叉排序树(二叉搜索树)区别

平衡二叉树和二叉排序树(二叉搜索树)区别

平衡⼆叉树和⼆叉排序树(⼆叉搜索树)区别
平衡⼆叉树是⼀种⼆叉搜索树。

其可以保证在log2(n)的时间内找到节点,⽽普通的⼆叉搜索树在最坏情况下性能近似与链
表,所⽤时间为log(n)。

常⽤的平衡⼆叉树有AVL树和红⿊树其算法的难点在于插⼊删除节点后树的旋转
平衡⼆叉树 ----> O(log2(n))
普通⼆叉搜索树 ----> O(n)
在⼆叉搜索树的插⼊和删除运算中,采⽤平衡树的优点是:使树的结构较好,从⽽提⾼查找运算的速度。

缺点是:是插⼊和删除运算变得复杂化,从⽽降低了他们的运算速度。

对⼆叉搜索树删除节点⽽引起的不平衡性进⾏的操作⽐插⼊节点的情况要复杂,在此就不再论述了。

操作系统的设计也有⽤到哦
很多数据库的实现是基于更复杂的平衡⼆叉树
可以⾃⼰实现⼀个集合或者map,统计单词出现的次数
stl的map/set都在⽤
普通⼆叉搜索树最坏情况是只有左边⼀个分⽀,如1-2-3-4-5(5在最上⾯,1在左下⾓),但是平衡⼆叉树可以调整。

为1-2-3-4-5(3在最上⾯,1在左下⾓,5在右下⾓)。

平衡⼆叉树 ----> O(log2(n))
普通⼆叉搜索树 ----> O(n)
所以平衡⼆叉树的搜索性能⽐⼆叉搜索树(⼆叉排序树)好。

数据结构c语言课设-二叉树排序

数据结构c语言课设-二叉树排序

题目:二叉排序树的实现1 内容和要求1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么?2 解决方案和关键代码2.1 解决方案:先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。

前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。

要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。

2.2关键代码树的根本构造定义及根本函数typedef struct{KeyType key;} ElemType;typedef struct BiTNode//定义链表{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree, *SElemType;//销毁树int DestroyBiTree(BiTree &T){if (T != NULL)free(T);return 0;}//清空树int ClearBiTree(BiTree &T){if (T != NULL){T->lchild = NULL;T->rchild = NULL;T = NULL;}return 0;}//查找关键字,指针p返回int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {if (!T){p = f;return FALSE;}else if EQ(key, T->data.key){p = T;return TRUE;}else if LT(key, T->data.key)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);}二叉树的生成、插入,删除生成void CreateBST(BiTree &BT, BiTree p){int i;ElemType k;printf("请输入元素值以创立排序二叉树:\n");scanf_s("%d", &k.key);for (i = 0; k.key != NULL; i++){//判断是否重复if (!SearchBST(BT, k.key, NULL, p)){InsertBST(BT, k);scanf_s("%d", &k.key);}else{printf("输入数据重复!\n");return;}}}插入int InsertBST(BiTree &T, ElemType e){BiTree s, p;if (!SearchBST(T, e.key, NULL, p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p)T = s;else if LT(e.key, p->data.key)p->lchild = s;elsep->rchild = s;return TRUE;}else return FALSE;}删除//某个节点元素的删除int DeleteEle(BiTree &p){BiTree q, s;if (!p->rchild) //右子树为空{q = p;p = p->lchild;free(q);}else if (!p->lchild) //左子树为空{q = p;p = p->rchild;free(q);}else{q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}p->data = s->data;if (q != p)q->rchild = s->lchild;elseq->lchild = s->lchild;delete s;}return TRUE;}//整棵树的删除int DeleteBST(BiTree &T, KeyType key) //实现二叉排序树的删除操作{if (!T){return FALSE;}else{if (EQ(key, T->data.key)) //是否相等return DeleteEle(T);else if (LT(key, T->data.key)) //是否小于return DeleteBST(T->lchild, key);elsereturn DeleteBST(T->rchild, key);}return 0;}二叉树的前中后根遍历栈的定义typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int InitStack(SqStack &S) //构造空栈{S.base = (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackint Push(SqStack &S, SElemType e) //插入元素e为新栈顶{if (S.top - S.base >= S.stacksize){S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//Pushint Pop(SqStack &S, SElemType &e) //删除栈顶,应用e返回其值{if (S.top == S.base) return ERROR;e = *--S.top;return OK;}//Popint StackEmpty(SqStack S) //判断是否为空栈{if (S.base == S.top) return TRUE;return FALSE;}先根遍历int PreOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);if (!Visit(p->data)) return ERROR;p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}中根遍历int InOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);if (!Visit(p->data)) return ERROR;p = p->rchild;}}return OK;}后根遍历int PostOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S, SS;BiTree p;InitStack(S);InitStack(SS);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);Push(SS, p);p = p->rchild;}else{if (!StackEmpty(S)){Pop(S, p);p = p->lchild;}}}while (!StackEmpty(SS)){Pop(SS, p);if (!Visit(p->data)) return ERROR;}return OK;}利用数组存储一个班学生信息ElemType a[] = { 51, "陈继真", 88,82, "黄景元", 89,53, "贾成", 88,44, "呼颜", 90,25, "鲁修德", 88,56, "须成", 88,47, "孙祥", 87, 38, "柏有患", 89, 9, " 革高", 89, 10, "考鬲", 87, 31, "李燧", 86, 12, "夏祥", 89, 53, "余惠", 84, 4, "鲁芝", 90, 75, "黄丙庆", 88, 16, "李应", 89, 87, "杨志", 86, 18, "李逵", 89, 9, "阮小五", 85, 20, "史进", 88, 21, "秦明", 88, 82, "杨雄", 89, 23, "刘唐", 85, 64, "武松", 88, 25, "李俊", 88, 86, "卢俊义", 88, 27, "华荣", 87, 28, "杨胜", 88, 29, "林冲", 89, 70, "李跃", 85, 31, "蓝虎", 90, 32, "宋禄", 84, 73, "鲁智深", 89, 34, "关斌", 90, 55, "龚成", 87, 36, "黄乌", 87, 57, "孔道灵", 87, 38, "张焕", 84, 59, "李信", 88, 30, "徐山", 83, 41, "秦祥", 85, 42, "葛公", 85, 23, "武衍公", 87, 94, "范斌", 83, 45, "黄乌", 60, 67, "叶景昌", 99, 7, "焦龙", 89, 78, "星姚烨", 85, 49, "孙吉", 90, 60, "陈梦庚", 95,};数组查询函数void ArraySearch(ElemType a[], int key, int length){int i;for (i = 0; i <= length; i++){if (key == a[i].key){cout << "学号:" << a[i].key << " 姓名:" << a[i].name << " 成绩:" << a[i].grade << endl;break;}}}二叉树查询函数上文二叉树根本函数中的SearchBST()即为二叉树查询函数。

二叉树的5种基本形态。 -回复

二叉树的5种基本形态。 -回复

二叉树的5种基本形态。

-回复二叉树是计算机科学中常见的数据结构之一,它由节点和连接节点的边组成。

每个节点最多有两个子节点,分别称为左子节点和右子节点。

基于节点连接的不同方式,二叉树可以存在多种基本形态。

在本文中,我们将探讨二叉树的五种基本形态,并详细介绍它们的特点、应用场景以及如何构建和遍历。

一、满二叉树满二叉树是一种非常特殊的二叉树,每一层节点都达到了最大数量,而且所有的叶子节点都在同一层。

满二叉树的特点是每个节点要么没有子节点,要么有两个子节点。

满二叉树中的节点数量可以通过公式2^n - 1来计算,其中n为树的高度。

满二叉树的构建通常是基于完全二叉树进行。

满二叉树的应用场景包括:数据索引结构、哈夫曼编码。

二、完全二叉树完全二叉树是一种叶子节点除了最后一层可以不满外,其余的层节点都达到了最大数量的二叉树。

与满二叉树不同的是,完全二叉树的叶子节点总是尽量靠左分布。

完全二叉树可以通过数组来表示,节点的索引与数组中的位置一一对应。

完全二叉树的应用场景包括:堆数据结构、哈夫曼编码、优先队列。

三、二叉搜索树二叉搜索树(Binary Search Tree,BST)是一种有序的二叉树结构,其中左子树的所有节点值均小于根节点的值,右子树的所有节点值均大于根节点的值。

对于二叉搜索树的任意节点,左子树和右子树都是一棵二叉搜索树。

二叉搜索树的应用场景包括:快速搜索、有序数据存储、二叉排序树。

四、平衡二叉树平衡二叉树是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1。

通过保持树的平衡性,平衡二叉树可以提供更快的搜索和插入操作。

平衡二叉树的应用场景包括:数据库索引、动态变化的数据集。

五、二叉链表二叉链表是一种常见的二叉树实现方式,它使用节点对象保存值和左右子节点的引用。

每个节点对象都包含一个值和两个指针,分别指向左子节点和右子节点。

通过这样的方式,可以使用链表来存储和表示二叉树。

二叉链表的应用场景包括:树的遍历、树的操作。

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

数据结构与算法系列研究五——树、⼆叉树、三叉树、平衡排序⼆叉树AVL树、⼆叉树、三叉树、平衡排序⼆叉树AVL⼀、树的定义树是计算机算法最重要的⾮线性结构。

树中每个数据元素⾄多有⼀个直接前驱,但可以有多个直接后继。

树是⼀种以分⽀关系定义的层次结构。

a.树是n(≥0)结点组成的有限集合。

{N.沃恩}(树是n(n≥1)个结点组成的有限集合。

{D.E.Knuth})在任意⼀棵⾮空树中:⑴有且仅有⼀个没有前驱的结点----根(root)。

⑵当n>1时,其余结点有且仅有⼀个直接前驱。

⑶所有结点都可以有0个或多个后继。

b. 树是n(n≥0)个结点组成的有限集合。

在任意⼀棵⾮空树中:⑴有⼀个特定的称为根(root)的结点。

⑵当n>1时,其余结点分为m(m≥0)个互不相交的⼦集T1,T2,…,Tm。

每个集合本⾝⼜是⼀棵树,并且称为根的⼦树(subtree)树的固有特性---递归性。

即⾮空树是由若⼲棵⼦树组成,⽽⼦树⼜可以由若⼲棵更⼩的⼦树组成。

树的基本操作1、InitTree(&T) 初始化2、DestroyTree(&T) 撤消树3、CreatTree(&T,F) 按F的定义⽣成树4、ClearTree(&T) 清除5、TreeEmpty(T) 判树空6、TreeDepth(T) 求树的深度7、Root(T) 返回根结点8、Parent(T,x) 返回结点 x 的双亲9、Child(T,x,i) 返回结点 x 的第i 个孩⼦10、InsertChild(&T,&p,i,x) 把 x 插⼊到 P的第i棵⼦树处11、DeleteChild(&T,&p,i) 删除结点P的第i棵⼦树12、traverse(T) 遍历树的结点:包含⼀个数据元素及若⼲指向⼦树的分⽀。

●结点的度: 结点拥有⼦树的数⽬●叶结点: 度为零的结点●分枝结点: 度⾮零的结点●树的度: 树中各结点度的最⼤值●孩⼦: 树中某个结点的⼦树的根●双亲: 结点的直接前驱●兄弟: 同⼀双亲的孩⼦互称兄弟●祖先: 从根结点到某结点j 路径上的所有结点(不包括指定结点)。

数据结构课程设计

数据结构课程设计

“数据结构”课程设计报告二叉排序树的查找与性能分析学生姓名:段晓宣,张静指导教师:陈少军所在系:电子信息系所学专业:计算机科学与技术年级: 2010级计算机(1)班目录第一章需求分析1.1选题要求 (3)1.2选题的背景与意义 (3)1.3本组课程设计的目标 (3)1.4人员组成和分工 (3)第2章概要分析 (4)2.1系统数据流图 (4)2.2原始数据 (4)2.3输出数据 (4)2.4对数据的处理 (5)2.5数据结构 (5)2.6模块划分 (5)第3章详细设计 (6)3.1二叉排序树的创建 (6)3.2二叉排序树的插入 (7)3.3二叉排序树的查找 (7)3.4计算多数据的平均查找长度 (9)3.5主函数 (9)第4章用户手册 (10)4.1 用户须知 (10)第5章系统测试 (11)项目总结 (12)参考文献 (13)二叉树排序树的查找与性能分析摘要:21世纪是信息化的时代,计算机深入到生活的各个领域。

随着计算机的发展,许多高科技产品如雨后春笋应运而生。

但究其本质而言,无非是以前的理论加以包装。

对于数据控制、管理及处理等方面也可见一斑。

在如今应用的计算机的数据存储方式仍然主要以线性,树型,图型等为主要的及结构。

因此了解并掌握数据结构的知识是很有必要的。

在此次实训期间,本组人员通过运用所学数据结构的知识,进行以二叉排序树的查找与性能分析为题的课程设计,在同组人员的共同努力下,基本实现了:1.创建二叉排序树2.利用文件存储二叉排序树3.二叉排序树的插入4.二叉排序树的查找5.二叉排序树平均查找长度的算法第1章需求分析1.1选题要求(1)根据输入的先序及递归建立二叉排序树;(2)通过文件,向二叉排序树插入结点,并生成二叉树;(3)设置报名号为关键字,可以根据关键字进行查找;(5)查找的同时可以判断比较的次数;(6)根据查找的算法计算出10000个数据平均查找长度;1.2选题的背景与意义(1)树型存储结构数据存储结构中重要的组成部分,二叉树由是树的重点。

数据结构之二叉树(BinaryTree)

数据结构之二叉树(BinaryTree)

数据结构之⼆叉树(BinaryTree)⽬录导读 ⼆叉树是⼀种很常见的数据结构,但要注意的是,⼆叉树并不是树的特殊情况,⼆叉树与树是两种不⼀样的数据结构。

⽬录 ⼀、⼆叉树的定义 ⼆、⼆叉树为何不是特殊的树 三、⼆叉树的五种基本形态 四、⼆叉树相关术语 五、⼆叉树的主要性质(6个) 六、⼆叉树的存储结构(2种) 七、⼆叉树的遍历算法(4种) ⼋、⼆叉树的基本应⽤:⼆叉排序树、平衡⼆叉树、赫夫曼树及赫夫曼编码⼀、⼆叉树的定义 如果你知道树的定义(有限个结点组成的具有层次关系的集合),那么就很好理解⼆叉树了。

定义:⼆叉树是n(n≥0)个结点的有限集,⼆叉树是每个结点最多有两个⼦树的树结构,它由⼀个根结点及左⼦树和右⼦树组成。

(这⾥的左⼦树和右⼦树也是⼆叉树)。

值得注意的是,⼆叉树和“度⾄多为2的有序树”⼏乎⼀样,但,⼆叉树不是树的特殊情形。

具体分析如下⼆、⼆叉树为何不是特殊的树 1、⼆叉树与⽆序树不同 ⼆叉树的⼦树有左右之分,不能颠倒。

⽆序树的⼦树⽆左右之分。

2、⼆叉树与有序树也不同(关键) 当有序树有两个⼦树时,确实可以看做⼀颗⼆叉树,但当只有⼀个⼦树时,就没有了左右之分,如图所⽰:三、⼆叉树的五种基本状态四、⼆叉树相关术语是满⼆叉树;⽽国际定义为,不存在度为1的结点,即结点的度要么为2要么为0,这样的⼆叉树就称为满⼆叉树。

这两种概念完全不同,既然在国内,我们就默认第⼀种定义就好)。

完全⼆叉树:如果将⼀颗深度为K的⼆叉树按从上到下、从左到右的顺序进⾏编号,如果各结点的编号与深度为K的满⼆叉树相同位置的编号完全对应,那么这就是⼀颗完全⼆叉树。

如图所⽰:五、⼆叉树的主要性质 ⼆叉树的性质是基于它的结构⽽得来的,这些性质不必死记,使⽤到再查询或者⾃⼰根据⼆叉树结构进⾏推理即可。

性质1:⾮空⼆叉树的叶⼦结点数等于双分⽀结点数加1。

证明:设⼆叉树的叶⼦结点数为X,单分⽀结点数为Y,双分⽀结点数为Z。

《二叉树的概念》课件

《二叉树的概念》课件
过程中进行一些特定的操作。
05
二叉树的应用
Chapter
在数据结构中的应用
二叉搜索树
二叉搜索树是一种特殊的二叉树,它的每个节点的左子树上的所有元素都小于 该节点,右子树上的所有元素都大于该节点。这种数据结构可以用于快速查找 、插入和删除操作。
AVL树和红黑树
这两种二叉树都是自平衡二叉搜索树,它们通过调整节点的左右子树的高度来 保持树的平衡,从而在插入、删除等操作时具有较好的性能。
VS
详细描述
平衡二叉树的特点是,它的左右子树的高 度差不会超过1,且左右子树都是平衡二 叉树。平衡二叉树的性质还包括,它的所 有叶节点的层数相等,且所有非叶节点的 左右子树的高度差不超过1。平衡二叉树 的查找、插入和删除操作的时间复杂度为 O(log n),其中n为节点数。
04
二叉树的遍历
Chapter
决策树
在机器学习和人工智能领域,决策树 是一种重要的分类和回归方法。其基 础结构就是二叉树,通过构建决策树 ,可以解决分类和回归问题。
THANKS
感谢观看
代码表示法
总结词:严谨规范
详细描述:使用编程语言的语法结构来表示二叉树,每个节点用对象或结构体表示,节点间的关系通 过指针或引用表示,严谨规范,易于编写和调试。
03
二叉树的性质
Chapter
深度最大的二叉树
总结词
深度最大的二叉树是指具有最大 可能深度的二叉树。
详细描述
在二叉树中,深度最大的二叉树 是满二叉树,即每个层级都完全 填满,没有空缺的节点。满二叉 树的深度等于其节点总数减一。
02
二叉树的表示方法
Chapter
图形表示法
总结词:直观明了
详细描述:通过图形的方式展示二叉树的结构,每个节点用圆圈或方框表示,节 点间的关系用线段表示,直观易懂,易于理解。

数据结构课程思政课程设计

数据结构课程思政课程设计

数据结构课程思政课程设计一、课程目标知识目标:1. 让学生掌握数据结构的基本概念,包括线性表、树、图等结构的特点和应用场景。

2. 使学生了解各类数据结构在解决问题中的优势与局限,并能运用相关知识对实际问题进行分析和描述。

3. 培养学生运用所学数据结构知识,解决实际编程问题的能力。

技能目标:1. 培养学生运用数据结构进行问题分析和算法设计的能力。

2. 提高学生编程实践能力,使其能熟练使用至少一种编程语言实现常见数据结构及相关算法。

3. 培养学生团队协作和沟通能力,通过小组讨论、项目实施等形式,提高解决实际问题的综合能力。

情感态度价值观目标:1. 培养学生对数据结构在计算机科学中的重要地位的认识,激发学习兴趣和探究精神。

2. 引导学生树立正确的价值观,认识到数据结构在解决实际问题中的积极作用,培养社会责任感和使命感。

3. 培养学生面对复杂问题时的耐心、细心和毅力,形成积极向上的学习态度。

本课程针对高中年级学生,结合数据结构课程的特点,注重理论与实践相结合,强调思政教育的融入。

在教学过程中,关注学生的个体差异,充分调动学生的积极性,引导他们主动参与课堂讨论和实践操作。

通过本课程的学习,期望学生能够掌握数据结构的基本知识和技能,培养良好的学习习惯和团队合作精神,形成积极向上的人生态度。

二、教学内容1. 线性表:包括线性表的定义、特点、实现方法及应用案例。

重点讲解顺序表、链表的结构特点及操作方法。

教材章节:第一章《线性表》2. 栈与队列:介绍栈与队列的基本概念、操作原理及在实际应用中的使用场景。

教材章节:第二章《栈与队列》3. 树与二叉树:讲解树的基本概念、二叉树的性质、遍历方法以及常见的树结构,如二叉排序树、平衡二叉树等。

教材章节:第三章《树与二叉树》4. 图:介绍图的基本概念、存储结构、遍历方法以及最短路径、最小生成树等算法。

教材章节:第四章《图》5. 查找与排序:讲解常见的查找算法(如二分查找、哈希查找等)和排序算法(如冒泡排序、快速排序等)的原理和实现。

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

数据结构课程设计---二叉排序树和平衡二叉树的判别二叉排序树和平衡二叉树的判别1引言数据结构是软件工程的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。

学习数据结构的最终目的是为了获得求解问题的能力。

对于现实世界中的问题,应该能从中抽象出一个适当的数据模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,在进行编程调试,最后获得问题的解答。

本次课程设计的题目是对二叉排序树和平衡二叉树的扩展延伸应用。

首先我们得建立一个二叉树,二叉树有顺序存储结构和链式存储结构两种存储结构,此次我选用的是二叉链表的存储结构。

对于判断平衡二叉树,需要求出其每个叶子结点所在的层数,这里我采用的边遍历边求的方式,遍历采用的是先序遍历。

二叉树的建立以及二叉排序树和平衡二叉树的判别中都用到了递归思想。

2需求分析2.1在日常生活中,人们几乎每天都要进行“查找”工作。

所谓“查找”即为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录),即关键字。

2.2本程序意为对一个已经建立的动态查找表——二叉树——判断其是否是二叉排序树和平衡二叉树。

3数据结构设计3.1抽象数据类型二叉树的定义如下:ADT BinaryTree{3.1.1数据对象D:D是具有相同特性的数据元素的集合。

3.1.2数据关系R:若D=NULL,则R=NULL,称BinaryTree为空的二叉树;若D!=NULL,则R={H},H是如下的二元关系:3.1.2.1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;3.1.2.2若D-{root}!=NULL,则存在D-{root}={Dl,Dr},且Dl与Dr相交为空;3.1.2.3若Dl!=NULL,则Dl中存在唯一的元素xl,<root,xl>属于H,且存在Dl上的关系Hl属于H;若Dr!=NULL,则Dr中存在唯一的元素xr,<root,xr>属于H,且存在Dr上的关系Hr属于H;H={<root,xl>,<root,xr>,Hl,Hr};3.1.2.4(Dl,{Hl})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

3.2基本操作P:InitBiTree(&T);操作结果:构造空二叉树T。

CreateBiTree(&T,definition);初始条件:definition给出二叉树T的定义。

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

}ADT Tree//包含头文件#include<iostream>using namespace std;//数据结构typedef struct Bitree{int w;struct Bitree *lchild;struct Bitree *rchild;}Bitree;//定义符号常量const Max=100;//定义全局变量Bitree * root;//根结点int i;//计数//自定义函数原型说明void creat(Bitree *p);//创建二叉树void Create();void judgeBST(Bitree * root);//判断二叉排序树void judge1();void judgeA VL(Bitree * root,int count,int mark[]);//判断平衡//二叉树void judge2(int mark[]);4算法设计4.1算法内容// Note:Your choice is C++ IDE#include<iostream>using namespace std;typedef struct Bitree{int w;struct Bitree *lchild;struct Bitree *rchild;}Bitree;const Max=100;Bitree *root;int i;//计数//创建二叉树void creat(Bitree *p)//按照树的先序遍历顺序输入数据,并且当结点的左右孩子不存在时输入0 {if(p!=0){//左孩子p->lchild=new Bitree;cout<<"请输入结点数据:";cin>>p->lchild->w;if(p->lchild->w!=0)creat(p->lchild);else{Bitree *q=p->lchild;p->lchild=0;delete q;}//右孩子p->rchild=new Bitree;cout<<"请输入结点数据:";cin>>p->rchild->w;if(p->rchild->w!=0)creat(p->rchild);else{Bitree *q=p->rchild;p->rchild=0;delete q;}}}void Create(){root=new Bitree;//按照树的先序遍历顺序输入数据,并且当结点的左右孩子不存在时输入0 cout<<"请输入结点数据:";cin>>root->w;if(root->w!=0)creat(root);else{Bitree *p=root;root=0;delete p;}}//下面两个函数为判断二叉树是否为二叉排序树void judgeBST(Bitree *root){Bitree *l,*r;if(root!=0){if(i==0){l=root->lchild;if(l!=NULL&&root->w<l->w){i++;return;}if(i==0){r=root->rchild;if(r!=NULL&&root->w>r->w){i++;return;}judgeBST(r);}}}}void judge1(){if(i==0)cout<<"是二叉排序树!"<<endl;else cout<<"不是二叉排序树!"<<endl;}//下面两个函数判断二叉树是否为平衡二叉树void judgeA VL(Bitree *root,int count,int mark[]){if(root==0)mark[i++]=count--;else{count++;judgeA VL(root->lchild,count,mark);judgeA VL(root->rchild,count,mark);}}void judge2(int mark[]){int mark2=0;for(int j=0;j<i;j++)if(mark[j]-mark[0]<-1||mark[j]-mark[0]>1)mark2=1;if(mark2==0)cout<<"是平衡二叉树!";else cout<<"不是平衡二叉树!";}//主函数void main(){Create();//创建二叉树//判断二叉树是否为二叉排序树i=0;//标志judgeBST(root);judge1();//判断二叉树是否为平衡二叉树int count=0,mark[Max];i=0;//计数judgeA VL(root,count,mark);}4.2调试分析整个程序分为三大块:建立二叉树、判断是否为二叉排序树、判断是否为平衡二叉树。

4.2.1建立时开始没有考虑二叉树为空的情况,并且没有注意不用的空间应释放。

经调整,已解决。

4.2.2判断二叉树是否为二叉排序树时,开始没注意到当结点为空时,是不能进行权值的大小比较的。

并且标志i一旦不为0即可不再进行比较了。

4.2.3二叉树是否为平衡二叉树时,应注意到只要mark[j]-mark[0]<-1和mark[j]-mark[0]>1满足其一就可,所以应用或运算符。

4.2.4调试中数据的输入应充分考虑各种情况:二叉树为空;二叉树非空时,既是二叉排序树又是平衡二叉树、是二叉排序树不是平衡二叉树、是平衡二叉树不是二叉排序树、既不是二叉排序树也不是平衡二叉树。

这样就可以充分检验程序的正确性。

4.3调试结果根据二叉树的先序遍历顺序输入结点,若结点不存在,输入结点数据0(或左右孩子不存在时,孩子结点数据输入0)4.3.1请输入结点数据:0是二叉排序树!是平衡二叉树!4.3.2请输入结点数据:4请输入结点数据:3请输入结点数据:2请输入结点数据:0请输入结点数据:0请输入结点数据:0请输入结点数据:1请输入结点数据:0请输入结点数据:0不是二叉排序树!是平衡二叉树!4.3.3请输入结点数据:5请输入结点数据:3请输入结点数据:2请输入结点数据:0请输入结点数据:0请输入结点数据:0请输入结点数据:0是二叉排序树!不是平衡二叉树!4.3.4请输入结点数据:4请输入结点数据:5请输入结点数据:2请输入结点数据:0请输入结点数据:0请输入结点数据:0请输入结点数据:0不是二叉排序树!不是平衡二叉树!4.3.5请输入结点数据:5请输入结点数据:4请输入结点数据:2请输入结点数据:0请输入结点数据:0请输入结点数据:0请输入结点数据:7请输入结点数据:6请输入结点数据:0请输入结点数据:0请输入结点数据:8请输入结点数据:0请输入结点数据:0是二叉排序树!是平衡二叉树!5有关技术的讨论本程序要解决的问题是建立一个二叉树,判断此二叉树是否为二叉排序树,判断此二叉树是否为平衡二叉树。

其中每个算法的设计都需要用到递归思想。

下面讨论一下这些算法思想:5.1建立二叉树时,是按照先序遍历的思想递归建立的。

递归的思想是:先建立根结点,然后建立左孩子,最后建立右孩子。

当某个结点为空时,输入其权值为0。

5.2判断二叉排序树时,先让根结点和左孩子结点比较,然后以左孩子结点为根结点,重复上述过程。

接着让根结点和右孩子结点比较,过程同上。

比较过程中一旦根结点小于其左孩子(或大于其右孩子),即让标致i变为1结束程序。

标致i==1时,二叉树不是二叉排序树;i==0时,是二叉排序树。

相关文档
最新文档