二叉排序树

二叉排序树的创建

被刻印的时光 ゝ 提交于 2020-01-20 07:56:10
# include <iostream> using namespace std ; //二叉排序树创建时候并不要求是有序的,如果是有序的将会成单支树(平衡二叉树可以调整) struct BTN { int data ; BTN * lchild ; BTN * rchild ; } ; //二分搜索 BTN * bsts ( BTN * r , int key ) { if ( r == NULL ) { return NULL ; } else { if ( r -> data == key ) { return r ; //返回结点 } else if ( key > r -> data ) { bsts ( r -> rchild , key ) ; //关键字大于中间值,去右子树 } else if ( key < r -> data ) { bsts ( r -> lchild , key ) ; //关键字小于中间值,去左子树 } } } //插入 int bstInsert ( BTN * & r , int ele ) { //这里传指针的别名是因为要对指针进行修改 //如果在改变指针了本身就要加别名,如果改变的是指针指向的位置并不用加别名 //这里每次递归调用传入的是左子树或者右子树,存的是下一个结点的地址,比如传的是右子树(r->rchild),递归过来也就是

二叉排序树求指点。!

自闭症网瘾萝莉.ら 提交于 2020-01-17 06:50:26
求大佬解答!!拜托!我是新手! #代码如下 #include<stdio.h> #include #include #define end 1 using namespace std; typedef struct { int key; int otherkey; }Elemtype; typedef struct BSTNode { Elemtype data; struct BSTNode* lchild, * rchild; }BSTNode, * BSTree; BSTNode S; void InsertBST(BSTree& T ,int e) { if (!T) { S = new BSTNode; S->data.key == e; S->lchild = S->rchild = NULL; T = S; } else if (e < T->data.key) InsertBST(T->lchild, e); else if (e > T->data.key) InsertBST(T->rchild, e); } void CreateBST(BSTree& T, int e) { T = NULL; while (e != end) { InsertBST(T, e); } } BSTree SearchBST(BSTree T, int key) { if ((

c++实现一个二叉排序树以及树的递归遍历的实现

丶灬走出姿态 提交于 2020-01-17 01:08:39
二叉排序树的理论介绍: https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/10905079?fr=aladdin 一棵空树,或者是具有下列性质的 二叉树 : (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。 二叉排序树的节点类定义: class node_data{ public: int data;//数据域 node_data *parent, *left, *right;//每个节点有3个指针,分别指向父节点,左节点和右节点 node_data() :data(0), parent(NULL), left(NULL), right(NULL){};//默认构造函数 node_data(int in_data) :data(in_data), parent(NULL), left(NULL), right(NULL) {};//产生一个节点 }; 二叉排序树的类定义: class binary_tree{ public: binary_tree(int num[], int len);//调用构造函数的时候,\

查找及其应用

。_饼干妹妹 提交于 2020-01-14 06:35:54
数据结构(实验C语言版) 查找及其应用 一、实验目的 (1)掌握在数组上进行各种查找的方法和算法 (2)深刻理解各种方法的特点,并能灵活运用 (3)加深对查找的理解,逐步培养解决实际问题的编程能力 二、实验环境 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: VS2010或Visual C++ 6.0或Win-TC等。 三、实验内容 设计一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能: (1) 由{4,9,0,1,8,6,3,5,2,7}创建一颗二叉排序bt并以括号表示输出。 (2) 判断bt是否为一颗二叉排序树。 (3) 查找关键字为6的结点,并输出其查找路径。 (4) 分别删除bt中关键字为4和5的节点,并输出删除后的二叉排序树。 四、实验要求 1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。 2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。 源代码 #include < stdio . h > #include < malloc . h > #define MaxSize 100 typedef int KeyType ; //定义关键字类型 typedef char InfoType ; typedef struct node //记录类型 { KeyType key ; //关键字项

数据结构系列,二叉平衡树的构建

感情迁移 提交于 2020-01-12 15:13:26
平衡二叉树 平衡二叉树,首先要是一种二叉排序树, 然后,其中每一个结点的左子树,右子树的高度差(左子树的高度 – 右子树的高度)至多等于1,二叉树的高度就是这棵树有几层。 将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,所有结点的平衡因子的值,只可能是-1, 0, 1。只要二叉树上有一个结点的平衡因子绝对值大于1,则该二叉树就是不平衡的。 距离插入结点最近的,且平衡因子的绝对值大于1的结点为跟的子树,称为最小不平衡子树。 当新插入结点37时,距离37这个结点最近的平衡因子绝对值超过1的结点是58,所以58就是最小不平衡子树。 为了构建平衡二叉树,需要在构建时,每次插入结点,先要检查是否因为插入结点破坏了树的平衡性,如果破坏了,就找出最小不平衡树,进行旋转,使之成为新的不平衡子树。 平衡二叉树,就是在二叉排序树的创建过程中保证他的平衡性,一旦插入结点出现不平衡,就马上旋转使其平衡。 当最小不平衡子树根结点的平衡因子BF大于1时,做右旋;当BF小于-1时做左旋; 当最小不平衡子树的BF与它的子树的BF符号相反时,就要先对它的子树进行一次旋转使得符号相同后,在反向旋转最小不平衡树,完成平衡操作。 依据上面的二叉排序树的插入,旋转策略,来实现构建一棵平衡二叉树。 现在有10个结点, Int a[10] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8}

二叉排序树和平衡二叉树的关系

好久不见. 提交于 2019-12-30 05:41:19
  二叉排序树: 二叉排序树又称二叉查找树,亦称二叉搜索树。 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值; (2)若右子树不空,则右子树所有结点的值均大于或等于它的根结点的值; (3)左、右子树也分别为二叉排序树   平衡二叉树: 又称为AVL树,它具有以下特征: 它是一棵空树或它的左右两个子树的高度差(称为平衡因子)不大于1的二叉排序树,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用算法有红黑树、AVL、Treap等。 来源: https://www.cnblogs.com/smuxiaolei/p/7501051.html

二叉树增删改查 && 程序实现

佐手、 提交于 2019-12-29 17:44:55
二叉排序树定义 一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。 二叉树删除节点 二叉排序树删除节点的时候为其删除后还是一个二叉排序树,要对不同的情况进行分别处理 1、p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则可以直接删除此子结点。 2、p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉排序树的特性。 3、p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法: 其一是令*p的左子树为*f的左/右(依*p是*f的左子树还是右子树而定)子树,*s为*p左子树的最右下的结点,而*p的右子树为*s的右子树; 其二是令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)-即让*f的左子树(如果有的话)成为*p左子树的最左下结点(如果有的话),再让*f成为*p的左右结点的父结点。 二叉排序树性能分析 每个结点的C(i)为该结点的层次数。最坏情况下

数据结构笔记:第七章 查找

寵の児 提交于 2019-12-25 21:34:04
查找基本概念: 列表:由同一类型的数据元素组成的集合。 关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。 键值:关键码的值。 主关键码:可以唯一地标识一个记录的关键码。 次关键码:不能唯一地标识一个记录的关键码。 查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。 查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。 静态查找 :不涉及插入和删除操作的查找 。 动态查找 :涉及插入和删除操作的查找。 查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。 线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。 树表:适用于动态查找,主要采用二叉排序树的查找技术。 散列表:静态查找和动态查找均适用,主要采用散列技术。 顺序查找: 基本思想: 从线性表的一端向另一端逐个将关键码与给定值进行比较, 若相等,则查找成功,给出该记录在表中的位置; 若整个表检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。 改进顺序查找: 基本思想:设置“哨兵”。 哨兵就是待查值, 将哨兵放在查找方向的尽头处, 免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。 int LineSearch :: SeqSearch(int k) { int i = length; //从数组高端开始比较

查找技术

喜夏-厌秋 提交于 2019-12-16 22:31:57
一、查找的基本概念 1.列表:由同一类型的数据元素组成的集合。 关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。 键值:关键码的值。 主关键码:可以唯一地标识一个记录的关键码。 次关键码:不能唯一地标识一个记录的关键码。 2.查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。 查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。 3.静态查找 :不涉及插入和删除操作的查找 。 动态查找 :涉及插入和删除操作的查找。 静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作; 或经过一段时间的查找之后,集中地进行插入和删除等修改操作; 动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。 4.查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。 线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。 树表:适用于动态查找,主要采用二叉排序树的查找技术。 散列表:静态查找和动态查找均适用,主要采用散列技术。 二、线性表的查找技术 1.普通的顺序查找 基本思想: 从线性表的一端向另一端逐个将关键码与给定值进行比较, 若相等,则查找成功,给出该记录在表中的位置; 若整个表检测完仍未找到与给定值相等的关键码

二叉搜索树、二叉排序树(Java代码实现)

社会主义新天地 提交于 2019-12-14 21:20:59
/** * @author:xingquanxiang createTime:2019/12/14 19:58 * description: 二叉搜索树、二叉排序树 * 特点: * 1.如果左子树不为空,则左子树上结点的值都小于根节点 * 2.如果右子树不为空,则右子树上结点的值都大于根节点 */ public class BinarySearchTree { int data; BinarySearchTree left; BinarySearchTree right; public BinarySearchTree(int data) { this.data = data; this.left = null; this.right = null; } public void insert(BinarySearchTree root, int data) { if (root != null) { if (root.data < data){ if (root.right != null){ insert(root.right, data); }else{ root.right = new BinarySearchTree(data); } }else{ if (root.left !=null){ insert(root.left, data); }else{ root