二叉搜索树

33、二叉搜索树的后序遍历

南楼画角 提交于 2020-01-06 18:26:03
1、题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 2、思路:二叉搜索树就是节点的左子树的值小于该节点的值,右子树的值大于该节点的值。所以对于二叉搜索树的后序列,左 右 根 的遍历顺序,数组的最后一个值一定是根节点,而根据二叉搜索树的性质,左子树的值小于根节点,右子树的值大于根节点,通过从前往后遍历数组,就可以初步找到左右子树的分界,分界之前一定是左子树,但是分界之后无法保证所有的值都大于根节点,因此要校验是否是右子树。校验完毕后,就在粗粒度上确定了符合二叉搜索树的条件,此时再分别将左右子树带入该方法进行迭代,在细粒度上确定整棵树是否完全符合二叉搜索树的性质。 3、代码: import java.util.*; import java.lang.*; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { //鲁棒性校验 if(sequence==null||sequence.length==0){ return false; } int length=sequence.length; //数组最后一个数就是根节点的值 int root=sequence[length-1]; /

LeetCode-95-不同的二叉搜索树II

China☆狼群 提交于 2020-01-02 21:10:49
二叉搜索数的插入、查找、删除 public class TestUtil { public static void main(String[] args) { TreeNode treeNode = new TreeNode(); List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); for (Integer value : list) { insert(treeNode, value); } } private static void insert(TreeNode root, Integer value) { if (root == null) { TreeNode treeNode = new TreeNode(); treeNode.value = value; treeNode.lChild = null; treeNode.rChild = null; root = treeNode; } if (root.value > value) { insert(root.lChild, value); } if (root.value < value) { insert(root.rChild, value); } } private static TreeNode find(TreeNode

剑指offer-二叉搜索树的后序遍历序列

拥有回忆 提交于 2019-12-30 22:52:51
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路 就是根据后序遍历找到根节点,小于根节点的就是左子树的范围,大于的就是右子树,根据这样来划分左右子树,然后进行递归遍历 思路是知道的,就是写代码的时候脑子混乱,写了很长时间才AC public class Solution { public boolean VerifySquenceOfBST ( int [ ] sequence ) { if ( sequence == null || sequence . length < 1 ) { return false ; } return VerifySquenceOfBST ( 0 , sequence . length - 1 , sequence ) ; } public boolean VerifySquenceOfBST ( int l , int r , int [ ] seq ) { if ( l < r ) { int root = seq [ r ] ; int index = l ; while ( index < r && seq [ index ] < root ) { index ++ ; } for ( int i = index ; i < r ; i

关于树,各种平衡树查找树的资料合集~~

我怕爱的太早我们不能终老 提交于 2019-12-30 05:40:37
我们知道,对于一般的二叉搜索树(Binary Search Tree) ,其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定。 但是,在某些极端的情况下(如在插入的序列是有序的时) ,二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n) 。我们可以通过 随机化 建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的 时间复杂度 。 平衡二叉搜索树 (Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度。 BST Binary Search Tree~ 二叉搜索树 ( Binary Search Tree ),或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左

PTA-二叉搜索树的插入排序

醉酒当歌 提交于 2019-12-29 20:38:27
二叉搜索树的插入排序 二叉搜索树定义为: 左子树仅包含小于根结点的元素; 右子树仅包含大于根结点的元素; 左右子树均为二叉搜索树。 一棵二叉搜索树可以有不同的插入顺序。例如,对于如下的二叉搜索树 figure.png 插入序列可以是 3 2 1 4 6 5, 也可以是 3 2 4 1 6 5 但不可以是 3 2 4 5 6 1。 下面给出一棵二叉搜索树的先序遍历序列,请编写程序求出该树的插入序列个数。考虑到总数可能非常大,请输出总数对 1000000007 (10 ​9 ​​ +7)取余的结果。 输入格式: 第一行给出一个整数 N (0<N<=100),表示二叉树中元素个数; 第二行给出 N 个正整数,以空格分隔,表示二叉树的先序遍历序列; 输出格式: 在一行中输出插入序列总数。 输入样例: 6 3 2 1 4 6 5 输出样例: 10 解题思路 1、先构造杨辉三角(用于存放组合数)。 2、先根据输入的序列先序构造成一个树。 3、根据这个已经构造好的二叉树计算它的插入序列总数,具体计算方式如下 对于一个结点 1、如果是叶子结点,那么它的插入序列只有一种 2、若果只有左子树,那么它的插入序列数和他的左子树一样 3、如果只有右子树,那么它的插入序列数和他的右子树一样 4、如果左右子树都有,则它的插入序列数等于左子树的序列个数 右子树的序列个数 (组合数)C(左子树的元素个数

leetcode-验证二叉搜索树

自闭症网瘾萝莉.ら 提交于 2019-12-26 07:53:31
​ /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { private boolean ret = true; public boolean isValidBST(TreeNode root) { if(root==null){ return true; } long maxnum = 111111111111111111L; long minnum = -1111111111111111111L; this.dfs(root,maxnum,minnum); return this.ret; } public void dfs(TreeNode root,long maxnum,long minnum){ if(!this.ret){ return ; } if(root.left!=null){ if(root.left.val>=root.val || root.left.val<=minnum){ this.ret = false; return ; } this.dfs(root.left

98#验证二叉搜索树

好久不见. 提交于 2019-12-25 13:30:29
题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / \ 1 3 输出: true 示例 2: 输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 分析 这一题乍一看,直觉告诉我就是要用递归的方法,一个初步的思路就是判断当前节点是不是大于左子结点且小于右子结点,然后往下递归,判断左子树和右子树分别是不是二叉搜索树,返回 左子树是&&右子树是 。 根据这个思路写了第一个错误版本的答案: 错误版本 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isValidBST (TreeNode root) { if (root == null) { return

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

点点圈 提交于 2019-12-23 11:01:02
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 首先需要知道,二叉搜索树的特点是,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。后序遍历是按照左——右——根的顺序进行遍历的。所以这道题的大体思路是,根据左子树小于根节点的特点,找到左子树的分界点,然后从右子树开始,看是不是所有的值都大于根节点,如果出现小于根节点的情况,说明不符合要求。然后对左子树 (l, k-1) 和右子树 (k, r-1) 进行递归。当 l >= r 时,说明判断完成,可以返回true。 还有要注意特判一下数组是否为空,如果为空,直接返回false。 c++代码如下: 1 class Solution { 2 public: 3 vector<int> seq; 4 bool VerifySquenceOfBST(vector<int> sequence) { 5 seq = sequence; 6 if(seq.empty()) return false; 7 return dfs(0, seq.size() - 1); 8 } 9 10 bool dfs(int l, int r){ 11 if(l >= r) return true; 12 int k = l; 13 while

PTA6-12 二叉搜索树的操作集 (30分)

情到浓时终转凉″ 提交于 2019-12-23 02:08:20
本题要求实现给定二叉搜索树的5种常用操作。 函数接口定义: BinTree Insert ( BinTree BST , ElementType X ) ; BinTree Delete ( BinTree BST , ElementType X ) ; Position Find ( BinTree BST , ElementType X ) ; Position FindMin ( BinTree BST ) ; Position FindMax ( BinTree BST ) ; 其中 BinTree 结构定义如下: typedef struct TNode * Position ; typedef Position BinTree ; struct TNode { ElementType Data ; BinTree Left ; BinTree Right ; } ; 函数 Insert 将 X 插入二叉搜索树 BST 并返回结果树的根结点指针; 函数 Delete 将 X 从二叉搜索树 BST 中删除,并返回结果树的根结点指针;如果 X 不在树中,则打印一行 Not Found 并返回原树的根结点指针; 函数 Find 在二叉搜索树 BST 中找到 X ,返回该结点的指针;如果找不到则返回空指针; 函数 FindMin 返回二叉搜索树 BST 中最小元结点的指针; 函数

26.二叉搜索树与双向链表

六月ゝ 毕业季﹏ 提交于 2019-12-22 06:14:39
layout: post post title: 26.二叉搜索树与双向链表 date: 2019-11-09 11:41:44 categories: 剑指offer tags: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 1、将左子树构成双链表,并返回该链表的头节点(左子树最左边的节点) 2、定位到左链表的最后一个节点(左子树最右边的节点) 3、如果左子树链表不为空,则将当前root追加到左子树链表后 4、将右子树构造成双向链表,并返回链表头结点(右子树最左边的节点) 5、如果右子树链表不为空,将右子树链表追加到当前root后 6、根据左子树链表是否为空返回的整体双向链表的头节点 代码 待写!!! 来源: CSDN 作者: 含糖的八宝粥 链接: https://blog.csdn.net/weixin_42905141/article/details/103641399