二叉搜索树

[数据结构] 搜索树与AVL树

佐手、 提交于 2020-03-03 00:18:40
文章目录 1. 搜索树 1.1. 理解二叉搜索树 1.2. 搜索树性能分析 2. AVL树 2.1. 理解AVL树 2.2. AVL树节点的数据结构 2.3. AVL树的插入 2.4. AVL树的旋转* 2.5. AVL树的删除 2.6. AVL树性能分析 1. 搜索树 1.1. 理解二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 如图所示 当进行数据搜索时 进行数据插入时过程与数据搜索相同, 找到一个适合自己的空节点 数据删除 1.2. 搜索树性能分析 插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能. 理想情况下, 插入的树是完全二叉树 最坏情况下, 插入的树成了单链树 最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:logn 最差情况下,二叉搜索树退化为单支树,其平均比较次数为:n / 2 2. AVL树 2.1. 理解AVL树 二叉搜索树虽可以缩短查找的效率, 但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下 . 因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M

唯一二叉搜索树

荒凉一梦 提交于 2020-03-03 00:15:17
原题   Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?   For example,   Given n = 3, there are a total of 5 unique BST’s. 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 题目大意   给定一个n个结点的二叉搜索树,求一共有多少个不同类型的二叉搜索树。 解题思路  当n=1时,只有1个根节点,则只能组成1种形态的二叉树,令n个节点可组成的二叉树数量表示为h(n),则h(1)=1; h(0)=0;   当n=2时,1个根节点固定,还有2-1个节点。这一个节点可以分成(1,0),(0,1)两组。即左边放1个,右边放0个;或者左边放0个,右边放1个。即:h(2)=h(0)*h(1)+h(1)*h(0)=2,则能组成2种形态的二叉树。   当n=3时,1个根节点固定,还有2个节点。这2个节点可以分成(2,0),(1,1),(0,2)3组。即h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=5,则能组成5种形态的二叉树。   以此类推,当n>=2时,可组成的二叉树数量为h(n)=h(0)*h(n-1)+h(1)*h(n-2)+

LeetCode701-二叉搜索树中的插入操作

孤者浪人 提交于 2020-03-01 17:29:22
英文链接: https://leetcode.com/problems/insert-into-a-binary-search-tree/ 中文链接: https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/ 题目详述 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。 例如, 给定二叉搜索树: 4 / 2 7 / 1 3 和 插入的值: 5 你可以返回这个二叉搜索树: 4 / 2 7 / / 1 3 5 或者这个树也是有效的: 5 / 2 7 / 1 3 4 题目详解 按二叉搜索树的性质插入即可。 1234567891011121314 public class { public TreeNode insertIntoBST(TreeNode root, int val) { if (root == null) { return new TreeNode(val); } if (root.val > val) { root.left = insertIntoBST(root.left, val); } else {

二叉搜索树

为君一笑 提交于 2020-03-01 11:51:39
二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。 它的左右子树也分别为二叉搜索树。 二叉搜索树的中序遍历是有序的。 二叉搜索树的查找 左子树比根结点小,右子树比根结点大,根据大小判断。如何查找 二叉搜索树的插入 找到插入的位置,记录父节点,左大右小。 二叉搜索树的删除 template < class T > struct BSTNode { BSTNode ( const T & data = T ( ) ) : _pLeft ( null ) , _pRight { } BSTNode < T > * _pLeft ; BSTNode < T > * _pRight ; T _data ; } ; template < class T > class BSTree { typedef BSTNode < T > Node ; BSTree ( ) : pRoot ( nullptr ) { } Node * find ( int val ) { Node * cur = pRoot ; if ( pRoot == nullptr ) return nullptr ; while ( cur ) { if ( cur -

95.不同的二叉搜索树(LeetCode)

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-01 00:59:29
95.不同的二叉搜索树(LeetCode) 一、问题描述 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 二、问题解析 二叉查找树   (Binary Search Tree,又名:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:   1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;   2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;   3.它的左、右子树也分别为二叉排序树。 分治法   基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同的或相似的子问题,知道最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。  1、分解:按数字范围逐个按 参照数 进行分解为左右两部分,分别求解  2、解决:实现递归函数,将分解后的数字范围作为参数,返回结果  3、合并:将返回的结果进行合并

二叉搜索树的创建(插入)、查找、删除、遍历(中序非递归)

久未见 提交于 2020-02-29 21:52:10
最近在学数据结构,前段时间学了二叉搜索树和平衡二叉树,但当时眼高手低就看了网课啥也没敲。。现在优点愧疚,就补上了。 二叉搜索树: 使用二分查找的思路构树(平衡二叉树完全就是,不过二叉搜索树有些遗憾)。特点:任一节点的权值都大于其左子树上所有点的权值,小于其右子树上所有点的权值。 平衡二叉树: 简介:也是搜索树,不过它改进了:二叉搜索树由于插入顺序的不同,最坏查找次数也不同,运气不好就是O(n). 官方解释: 任一节点的平衡因子的绝对值都不大于1(平衡因子:左子树的高度-右子树的高度。) 这样子由于二叉树的性质查找的时间复杂度就为log(n)了。 今天先展示二叉搜索树的常规操作:创建(也可以当作插入)、查找、删除。 我的代码(有BUG,根节点删除的情况当时没考虑到,所以不要删根节点,不然会段错误)。遍历我是使用的中序非递归(第二次遇到的时候打印) 代码:(有bug多谢指出) //二叉搜索树的创建(插入)/查找/删除 //二叉搜索树的创建(插入)/查找/删除 # include <stdio.h> # include <stdlib.h> typedef struct tree { int val ; struct tree * left , * right ; } tree ; int count = 0 ; tree * searchmax ( tree * p ) { /

剑指offer-二叉搜索树转化为双向链表,字符全排列,八皇后问题

感情迁移 提交于 2020-02-28 19:40:50
二叉搜索树转化为双向链表 思路: 二叉搜索树的中序遍历就是一个有序序列,对于根节点,当左子树有序之后,把它和左子树的最右节点链接起来。随后遍历右子树,第一个节点是右子树的最左节点,链接起来。 代码: void ConvertRecursion(TreeNode* root, TreeNode** pLastNode) { if (root == NULL) { return ; } TreeNode* currentNode = root; if (root->left) { ConvertRecursion(root->left, pLastNode); } currentNode->left = *pLastNode; //开始链接根和左子树的最后一个节点。 if (*pLastNode) (*pLastNode)->right = currentNode; //*pLastNode为指针 else cout << "LastNode is NULL" << endl; *pLastNode = currentNode; //最后一个指针指向当前节点 if (currentNode->right) { ConvertRecursion(root->right, pLastNode); } } TreeNode* TreeConvertToList(TreeNode *root)

【Golang】LeetCode-剑指Offer-面试题33-二叉搜索树的后序遍历序列【两种解法】

老子叫甜甜 提交于 2020-02-28 07:20:52
题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。 如果是则返回 true,否则返回 false。 假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3 示例 1: 输入: [1,6,3,2,5] 输出: false 示例 2: 输入: [1,3,2,6,5] 输出: true 提示: 数组长度 <= 1000 解题思路 二叉搜索树 左子树的元素是都小于根元素,右子树都大于根元素 后序遍历 首先遍历左子树,然后遍历右子树,最后访问根结点,所以数组最后一个元素是根元素。 从前面开始遍历,小于的当前根元素的值是左子树的 当找到第一个大于当前根元素的值,可以确定后半段的元素都应是在当前节点的右子树 如果后半段(右子树)里面有小于根元素的值的元素,就说明这个不是二叉搜索树的后序遍历 最后循环校验每个子树是否也满足二叉搜索树的后序遍历即可。 解法一:非递归 –执行用时:0 ms --内存消耗:2.1 MB func verifyPostorder ( postorder [ ] int ) bool { if len ( postorder ) <= 2 { return true } //在二叉搜索树中,左子树的元素是都小于根元素,右子树都大于根元素 //在后序遍历中,最后一个元素是根元素 head := len (

HDU-3719 二叉搜索树

江枫思渺然 提交于 2020-02-28 04:41:22
http://acm.hdu.edu.cn/showproblem.php?pid=3791 用数组建立二叉树: 二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2354 Accepted Submission(s): 1016 Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。 Output 如果序列相同则输出YES,否则输出NO Sample Input 2 567432 543267 576342 0 Sample Output YES NO Source 浙大计算机研究生复试上机考试-2010年 Recommend notonlysuccess //思路简单:只需要建树就行,判断是否为同一颗树。 //用数组建一颗树。 #include<stdio.h> #include

hdu 3791 二叉搜索树

故事扮演 提交于 2020-02-28 04:41:05
http://acm.hdu.edu.cn/showproblem.php?pid=3791 二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1905 Accepted Submission(s): 850 Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。 Output 如果序列相同则输出YES,否则输出NO Sample Input 2 567432 543267 576342 0 Sample Output YES NO 分析: 二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的 二叉树 : (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左