二叉排序树

树的概念

﹥>﹥吖頭↗ 提交于 2020-02-07 12:05:07
一、二叉树 1. 定义 二叉树的每个节点最多只有两棵子树,且子树有左右之分,次序不能颠倒。 2. 几种特殊的二叉树 (1)满二叉树(完美二叉树):所有非叶子节点均有两个子节点,所有叶子节点必须在同一层上。节点数达到最大值。 (2)完全二叉树:若设二叉树的深度为h,除第h层外,其它各层的节点数都达到最大值,第h层所有的节点都连续集中在最左边。 (3)完满二叉树:所有非叶子节点的度都是2。 二、二叉排序树 1. 定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值; (2)若有子树不空,则有子树上所有节点的值均大于或等于它的根节点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的节点。 2. 特性 对二叉排序树进行中序遍历,即可得到有序的数列。 3. 应用 可用于数据查找,其时间复杂度与二分查找一样。 二叉排序树的高度决定了二叉排序树的查找效率。 三、平衡二叉树 1. 为什么需要平衡二叉树 在某些极端情况下,二叉排序树将退化成近似链或链,其操作的时间复杂度将退化成线性的,为了防止这种情况的出现,需要使用某种算法来维持二叉排序树的平衡性,于是便有了平衡二叉树。 2. 定义 平衡二叉树又被称为AVL树,且有以下性质:它是一棵空树或它的左右两棵子树的高度差的绝对值不超过1

DS二叉排序树之查找

浪尽此生 提交于 2020-02-05 05:00:40
DS二叉排序树之查找 题目描述 给出一个数据序列,建立二叉排序树,并实现查找功能 对二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第四行输入m,表示要查找m个数据 从第五行起,输入m行,每行一个要查找的数据,都是自然数 以此类推输入下一个示例 输出 第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到 从第二行起,输出查找结果,如果查找成功输出查找次数,如果查找失败输出-1 以此类推输出下一个示例的结果 样例输入 1 6 22 33 55 66 11 44 7 11 22 33 44 55 66 77 样例输出 11 22 33 44 55 66 2 1 2 4 3 4 -1 #include <iostream> using namespace std; class BiNode{ int data; BiNode *lChild; BiNode *rChild; public: BiNode():lChild(NULL),rChild(NULL){} BiNode(int e):data(e),lChild(NULL),rChild(NULL){} friend class BiTree; }; class BiTree{

二叉排序树

自古美人都是妖i 提交于 2020-02-04 23:52:43
B - 二叉排序树 Description 二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树) Output Sample Input 2 123456789 987654321 432156789 0 Output NO NO 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> struct tree { char data; struct tree *l,*r; }*root,*root1; struct tree *create(char q,struct tree *root); char a[11],b[11]; int k=1; //主函数外定义

二叉搜索树

房东的猫 提交于 2020-02-01 01:07:08
今天刷题时候碰到了一个二叉排序树的问题 忽然发现我连二叉排序树是啥都不知道 : ) 看了下资料 自己敲了代码 现在记录一哈 二叉排序树 是一颗有规则的二叉树 它的左子树永远比他的根节点小,而根节点永远比右子树小 。 所以用中序遍历可以得到一个递增的集合。 关于二叉排序树的结构 : 值 value,左子树节点,右子树节点,还有双亲节点 class TreeNode1{ int val; TreeNode1 left; TreeNode1 right; TreeNode1 p; public TreeNode1(int v){ this.val = v; } } 它有一些简单的方法 这里不一一叙述 看函数名就知道 public static TreeNode1 getMinNode(TreeNode1 T){ if(T == null){ return T; } while(T.left != null){ T = T.left; } return T; } public static TreeNode1 getMaxNode(TreeNode1 T){ if(T == null){ return T; } while(T.right != null){ T = T.right; } return T; } public static TreeNode1 foundNode(int v

折半查找和二叉排序树

早过忘川 提交于 2020-01-30 12:23:43
一、实验目的 1、掌握查找的特点。 2、掌握折半查找的基本思想及其算法。 3、熟悉二叉排序树的特点,掌握二叉排序树的插入、删除操作。 二、实验内容 1、设有关键字序列k={ 5 ,14 ,18 ,21 ,23 ,29 ,31 ,35 },查找key=21和key=25的数据元素。 2、根据关键字序列{45、24、53、12、37、93}构造二叉排序树,并完成插入13删除关键字53和24的操作。 三、实验环境 Eclipse环境或C++编程环境 四、实验步骤 1、折半查找 (1)从键盘输入上述8个整数5 ,14 ,18 ,21 ,23 ,29 ,31 ,35,存放在数组bub[8]中,并输出其值。 (2)从键盘输入21,查找是否存在该数据元素,若存在,则输出该数据元素在表中的位置,否则给出查找失败的信息。 (3)从键盘输入25,查找是否存在该数据元素,若存在,则输出该数据元素在表中位置,否则给出查找失败的信息。 2、二叉排序树 (1)二叉排序树存储定义 (2)从键盘上输入六个整数45、24、53、12、37、9构造二叉排序树 (3)输出其中序遍历结果。 (4)插入数据元素13,输出其中序遍历结果。 (5)删除数据元素24和53,输出其中序遍历结果。 折半查找: package shiyan4 ; import java . util . Scanner ; public class

BUPT复试专题—二叉排序树(2012)

十年热恋 提交于 2020-01-28 04:20:53
https://www.nowcoder.com/practice/b42cfd38923c4b72bde19b795e78bcb3?tpId=67&tqId=29644&rp=0&ru=/kaoyan/retest/1005&qru=/ta/bupt-kaoyan/question-ranking 题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。 输入描述: 输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。 输出描述: 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。 示例1 输入 51 6 5 9 8 输出 1 6 5 9 8 1 5 6 8 9 5 8 9 6 1 建立一颗二叉排序树三序遍历即可 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<string.h> #include<string> #include<queue> using namespace std; struct Node { int val; Node *lch;

第二十一次-查找(二)

眉间皱痕 提交于 2020-01-24 01:33:32
折半查找 适用条件: Ø 线性表中的记录必须按关键码有序; Ø 必须采用顺序存储。 基本思想: 在有序表中(low, high,low<=high), 取中间记录作为比较对象, 若给定值与中间记录的关键码相等,则查找成功; 若给定值小于中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。 不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。 int LineSearch :: BinSearch1(int k){ int mid, low = 1, high = length; //初始查找区间是[1, n] while (low <= high) {//当区间存在时 mid = (low + high) / 2; if (k < data[mid]) high = mid - 1; else if (k > data[mid]) low = mid + 1; else return mid; //查找成功,返回元素序号 } return 0; //查找失败,返回0 } int LineSearch :: BinSearch2(int low, int high, int k){ if (low > high) return 0; //递归的边界条件 else { int mid = (low + high) /

《算法笔记》9.4小节——数据结构专题(2)->二叉查找树(BST)->问题 A: 二叉排序树

微笑、不失礼 提交于 2020-01-23 20:10:23
问题 A: 二叉排序树 时间限制: 1 Sec 内存限制: 32 MB 提交: 519 解决: 225 [ 提交 ][ 状态 ][ 讨论版 ][命题人:外部导入] 题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。 输入 输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21 [ 提交 ][ 状态 ] #include<iostream> using namespace std; struct node{ int data; node *lchild; node *rchild; }; node *newNode(int v){ node *root=new node; root->data=v; root->lchild=root->rchild=NULL; return root; } void insert(node *&root,int x){ if(root==NULL){ root

二叉排序树

自作多情 提交于 2020-01-23 17:09:53
二叉排序树 需求 给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加 解决方案分析 使用数组 数组未排序 , 优点 :直接在数组尾添加,速度快。 缺点 :查找速度慢。 数组排序 , 优点 :可以使用二分查找,查找速度快, 缺点 :为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。 使用链式存储-链表 不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。 使用二叉排序树 二叉排序树介绍 二又排序树: BST:(BinarySortTree),对于二又排序树的 任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大 。 特别说明: 如果有相同的值,可以将该节点放在左子节点或右子节点。 比如针对前面的数据(7,3,10,12,5,1,9),对应的二又排序树为: 二叉排序树的创建和遍历 一个数组创建成对应的二叉排序树,并使用中序遍历二又排序树,比如:数组为arr(7,3,10,12,5,1,9),创建成对应的二又排序树为: 二叉排序树的删除 二又排序树的删除情况比较复杂,有下面三种情况需要考虑 1)删除叶子节点(比如:2,5,9,12) 2)删除只有一颗子树的节点(比如:1) 3)删除有两颗子树的节点.(比如:7,3,10) 4)操作的思路分析 第一种情况: 删除叶子节点(比如

【我是一棵树】二叉排序树、平衡二叉树(AVL)

99封情书 提交于 2020-01-22 11:07:01
二叉排序树 又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树: 若他的左子树不空,则左子树上所有节点的值均小于它根节点的值 若他的右子树不空,则右子树上所有节点的值均大于根节点的值 它的左、右子树也分别为二叉排序树 二叉排序树特点 是以链接的方式存储,保持了链接存储结构在执行插入或删除操作室,不用一栋元素的优点,只要找到合适的插入和删除位置后,仅需修改链接指针即可。插入、删除时间性能比较好。而对于二叉排序树的查找,走的就是从根节点到需要查找的节点的路径,其比较次数等于给定值的节点在二叉树的层数。极端情况下,最少为1次,即根节点就是要找的点。最多也不会超过树的深度。可问题就在于,二叉排序树的形状是不确定的= = # 平衡二叉树 是一种排序二叉树,其中每个节点的左子树和右子树高度差之多等于1,也称AVL树。 从名字上也能看出来,这是一种高度平衡的二叉排序树。什么叫高度平衡,就是要么是一棵空树,要么它的左、右子树都是平衡二叉树。且左、右子树深度差绝对值不超过1.我们将二叉树上节点左子树深度减去右子树深度的值称为平衡因子BF(Balance Factory)。 距离插入节点最近的,且平衡因子绝对值大于1的节点为根的数,我们称为最小不平衡子树。 来源: CSDN 作者: 不了痕 链接: https://blog.csdn.net/qixinbruce/article