二叉搜索树

23-二叉搜索树的后序遍历序列

谁说我不能喝 提交于 2020-01-18 22:44:29
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 1.后续遍历我们可以知道,最右边的是根节点r。 2.通过根节点r我们可以判断左子树和右子树。 3.判断左子树中的每个值是否小于r,右子树的每个值是否大于r. 4.对左、右子树递归判断。 // 递归版 function VerifySquenceOfBST ( sequence ) { // write code here if ( sequence . length == 0 ) return false ; return isSquence ( sequence , 0 , sequence . length - 1 ) } function isSquence ( squence , start , end ) { if ( start >= end ) return true ; var i = start ; while ( i < end && squence [ i ] < squence [ end ] ) { i ++ ; } for ( var j = i ; j < end ; j ++

二叉搜索树,B树,B+树,索引

痴心易碎 提交于 2020-01-18 05:06:23
mongodb的默认存储引擎WiredTiger使用了B树索引 mysql的默认存储引擎InnoDB索引使用了B+树实现,那么各自为什么这样实现呢? 二叉搜索树 如上图是一个简单的二叉搜索树,是最为大家熟知的一种数据结构,它为什么不适合用作数据库索引? (1)当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢 (2)每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO B树 B树的特点是: (1)不再是单纯的二叉而是m叉 (2)叶子节点,非叶子节点,都存储数据 (3)中序遍历,可以获得所有节点 (4) 非根节点包含的关键字个数j满足, (┌m/2┐)-1 <= j <= m-1 ,节点分裂时要满足这个条件。 B+树 B+树,如上图,仍是m叉搜索树,在B树的基础上,做了一些改进: (1)非叶子节点不再存储数据,数据只存储在同一层的叶子节点上;B+树种 根到每一个节点的路径长度一样,而B树不是这样 (2)叶子之间,增加了链表,获取所有节点,不再需要中序遍历 这些改进让B+树比B树有更优的特性: (1)范围查找,定位min与max之后,中间叶子节点,就是结果集,不用中序回溯;范围查询在SQL中用得多,这是B+树比B树最大的优势。 (2)叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加锁,适合内存存储。 (3

不同的二叉搜索树 II

跟風遠走 提交于 2020-01-16 04:37:26
不同的二叉搜索树 II 今天做了下leetcode的题,又是喜闻乐见想不出思路,看了解答就豁然开朗。 leetcode题目链接 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 解题思路就是,根据二叉树的特性,如果一个数比当前节点小,那么就将数放到当前数的左节点,如果数比当前数大就放到当前节点的右节点。 而1 … n 为节点组成一个二叉搜索树。 那么当当前节点为i的时候,存在[1,i-1]个左子树,[i+1,n]个右子树。 根据上面的思路我们只需要得到从1到n为根节点的树就行了。 在以I为跟节点的时候,获取[1,i-1]的左子树,[i+1,n]的右子树就行。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public static List<TreeNode> generateTrees(int n) { if(n == 0){ return null; } return getTree(1,n); } public static List<TreeNode> getTree(int start, int end){ List<TreeNode> treeNodes = new ArrayList<TreeNode>()

《剑指offer》—— 二叉搜索树的后续遍历序列(Java)

久未见 提交于 2020-01-15 09:39:12
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { } } 思路: 先回顾了解一下二叉搜索树: 二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树 。 列如: 我们写一下上面这个二叉搜索树的后续遍历(左右根): 2,5,3,8,7,6 根据后续遍历规则以及二叉搜索树的规则,我们可以知道: 最后一个元素是根节点; 比最后一个元素大的,是树的右子树的元素;比最后一个树小的,是树的左子树的元素; 综上,我们可以将树划分成 [2,5,3] [8,7] [6] 其中 [6]是根结点, [2,5,3] 是左子树的后续遍历, [8,7] 是右子树的后续遍历。 我们可以将划分出来的 左子树 和 右子树 再继续按照上述方法划分; 一直到将元素划分完,划分过程中,如果没有违反二叉搜索树的规则

LeetCode 96 - 不同的二叉搜索树 - [DP]

↘锁芯ラ 提交于 2020-01-15 07:43:24
假定 $f[n]$ 表示有 $n$ 个节点的二叉树,有多少种不同结构。 因此 $f[n] = \sum_{i=0}^{n-1} (f[i] \times f[n-1-i])$,选一个节点作为根节点,那么剩下的 $n-1$ 个节点,分配到两棵子树。 AC代码: class Solution { public: int numTrees(int n) { if(n<=0) return 0; if(n==1) return 1; int f[n+1]; f[0]=f[1]=1; for(int i=2;i<=n;i++) { f[i]=0; for(int j=0;j<=i-1;j++) { int k=i-1-j; f[i]+=f[j]*f[k]; } } return f[n]; } }; 来源: https://www.cnblogs.com/dilthey/p/10775744.html

二叉搜索树的第k个结点

喜你入骨 提交于 2020-01-14 11:19:23
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 看到题目中提到 二叉搜索树按大小顺寻 则想到左序遍历得到的数是由小到大排列的 public class Solution { int index = 0; TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot != null){ TreeNode node = KthNode(pRoot.left,k); if(node != null){ return node; } index++; if(index == k){ return pRoot; } node = KthNode(pRoot.right,k); if(node != null){ return node; } } return null; } } 相关知识 二叉搜索树 树的基本知识 二叉树的知识 二叉查找树 平衡二叉树 红黑树 B树,B-树,B+树 二叉搜索树具有以下性质: 如果节点的左子树不空,则左子树上所有结点的值均小于等于它的根结点的值; 如果节点的右子树不空,则右子树上所有结点的值均大于等于它的根结点的值; 任意节点的左、右子树也分别为二叉查找树; 来源: CSDN 作者: zyp7355 链接: https://blog.csdn

Leetcode 96.不同的二叉搜索树

ε祈祈猫儿з 提交于 2020-01-14 07:01:15
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3二叉搜索树:左边节点都比根节点小,右边节点都比根节点大。有规律可以得出是标准卡特兰数:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2) h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n个物品中取n个的组合数) class Solution { public: int numTrees(int n) { if(n <= 1) return 1; int dp[n+1]; memset(dp,0,sizeof(dp)); dp[0] = 1; for(int i = 1; i <= n;++i) { int sum = 0; for(int j = 0;j < i; ++j) sum += dp[j] *dp[i-j-1]; dp[i] = sum; } return dp[n]; } }; 来源: https://www.cnblogs.com/Jawen/p/10816617.html

96. 不同的二叉搜索树

半城伤御伤魂 提交于 2020-01-14 00:05:54
题目描述 评论 (106) 题解 New 提交记录 给定一个整数 n ,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3解题思路:卡兰特数 public int numTrees(int n) { int[] N = new int[n+1]; N[0]=1; N[1]=1; for(int i=2;i<n+1;i++) { for(int j=0;j<i;j++) { N[i]+=N[j]*N[i-j-1]; } } return N[n]; } 来源: https://www.cnblogs.com/godoforange/p/10878801.html

3.6二叉搜索树

喜你入骨 提交于 2020-01-13 21:37:29
# include <stdio.h> # include <string.h> using namespace std ; struct node { node * lchild ; node * rchild ; int c ; } tree [ 100 ] ; char str1 [ 21 ] , str2 [ 21 ] ; //分别存放两比较输入的先序+中序序列 int size1 , size2 ; //存放字符串长 char * str ; //指向正在输入的字符串 int * size ; //计算正在输入字符串长 //str,size与str1 str2,&size1 &size2对应 int loc ; node * creat ( ) { //生成节点 tree [ loc ] . lchild = tree [ loc ] . rchild = NULL ; return & tree [ loc ++ ] ; //返回指针并处理下一节点 } //递归先序遍历 void preorder ( node * tree ) { str [ ( * size ) ++ ] = tree - > c - '0' ; //将扫描到的字符转为数字放入str中 if ( tree - > lchild != NULL ) preorder ( tree - > lchild

LeetCode 96. 不同的二叉搜索树

蓝咒 提交于 2020-01-13 07:48:32
给定一个整数 n ,求以 1 ... n 为节点组成的二叉搜索树有多少种? 算法:动态规划。我们用f[i]表示i个结点的BST有多少种。那么左子树可能为0,1,...n-1。对应的右子树则为n-1,...0。根据排列组合知,总数为f[k]*f[n-k-1]求和。 class Solution { public: int numTrees(int n) { vector<int>f(n+1); f[0]=1; for(int i=1;i<=n;i++){ f[i]=0; for(int j=1;j<=i;j++) f[i]+=f[j-1]*f[i-j]; } return f[n]; } }; 来源: https://www.cnblogs.com/programyang/p/11166704.html