BST,AVL,红黑树;B/B+树的概念及部分题解

leetcode98.验证二叉查找树、leetcode230.查找二叉查找树中第K小的元素、leetcode110.验证一颗二叉树是否是平衡二叉树
1.BST(Binary Search Tree)二叉搜索树:

    a.性质:

        1.左子树上的所有结点都小于根节点

        2.右子树上的所有结点都大于根节点

        3.左右子树分别也是二叉查找树(树结构一般采用递归定义,因此对于树方面的题一般考虑递归解也比较方便)

        4.对BST进行中序遍历,得到的将是一个升序序列

    b.特点:

        根据性质可以对BST进行类似二分搜索,最好情况为log(n);主要缺点是BST的结构依赖于元素的插入顺序因此,在BST的基础上,又出现了AVL树,红黑树,它们两个都是基于二叉查找树,只是在二叉查找树的基础上又对其做了限制.

2.AVL(平衡的二叉搜索树,AVL是作者名简称):

    a.性质:

        1.AVL树首先是一颗二叉搜索树,因此符合BST的性质;

        2.AVL树也是一颗平衡二叉树,即左右子树的高度差<=1 && 左右子树也是平衡二叉树;

     b.特点:

        由于维护高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树。

3.红黑树

    一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是red或black。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍。它是一种弱平衡二叉搜索树  。  相对于严格平衡的AVL树来说,它的旋转次数变少,所以对于搜索,插入,删除操作多的情况下,我们就用红黑树。

    a.性质(参算导):

    1.每个节点有一个color字段,∈{红,黑};非红即黑;

    2.根节点为黑的;

    3.每个页结点都是黑的(Null指针),有值的是内部结点;

    4.若一个节点是红的,则它的两个孩子是黑的;

    5.对于任意节点而言,其到叶子点树NIL指针的每条路径都包含相同数目的黑节点。

4.B/B+树

    注意B-树就是B树,-只是一个符号。B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(多叉平衡搜索树)。与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(B/B+是多叉,红黑树是二叉)。

    B+树只有叶子节点存放信息,B树叶子节点与内部结点均存放信息;B+树叶子节点链接。

    B+树更适合区间查询,常用于数据库索引;B树常用于文件索引。

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

《BST,AVL,红黑树;B/B+树的概念及部分题解》

B+树的叶子节点会形成一个链表

《BST,AVL,红黑树;B/B+树的概念及部分题解》

leetcode98.验证二叉查找树

class Solution {
    //1.利用BST的性质,以root为根的所有结点应该有一个值区间[min.max],但是要考虑数据溢出。
    public boolean isValidBSTII(TreeNode root) {
       return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    //以root为根的树的所有结点值应该∈[min,max],递归利用BST的性质
    private boolean isValidBST(TreeNode root,long min,long max){
    	if(root==null){
    		return true;
    	}
    	if(root.val<min || root.val>max){
    		return false;
    	}
    	return isValidBST(root.left, min, (long)root.val-1) && isValidBST(root.right, (long)root.val+1, max);
    }
   //2.非递归中序遍历,参题230,依次访问的是第K小的元素,k from 1 upto n
    public boolean isValidBST(TreeNode root) {
        Stack<TreeNode> stack=new Stack<TreeNode>();
        TreeNode pre=null;//上一个访问的结点;出栈时访问。
        while(!(stack.isEmpty() && root==null)){//root代表一颗从未进过的树,经过!=访问
        	if(root!=null){
        		while(root!=null){
        			stack.push(root);
        			root=root.left;
        		}
        	}else{
        		TreeNode current=stack.pop();
        		if(pre!=null && pre.val>=current.val){
        			return false;
        		}
        		pre=current;
        		root=current.right;
        	}
        }
        return true;
    }
}

leetcode230.查找二叉查找树中第K小的元素

class Solution {
    //230.查找二叉搜索树第K小的元素,1<=k<=结点数
    //非递归中序遍历(左子树,根节点,右子树),持续压左边界。依次访问的是第K小的元素,k from 1 upto n
    //变形:若要找BST第K大元素,则进行另一种形式的非递归中序遍历:(右子树,根节点,左子树),持续压右边界。
    public int kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> stack=new Stack<TreeNode>();
        while(!(stack.isEmpty() && root==null)){
        	if(root!=null){
        		stack.push(root);
        		root=root.left;
        	}else{
        		TreeNode current=stack.pop();
        		k--;
        		if(k==0){
        			return current.val;
        		}
        		root=current.right;
        	}
        }
        return -1;
    }
}

leetcode110.验证一颗二叉树是否是平衡二叉树

class Solution {
    public boolean isBalanced(TreeNode root) {
        return isBalancedImp(root)==-1?false:true;
    }
    //主要是因为该题涉及子问题的两个信息(boolean 子树是否是平衡的 && int 子树的高度),这样会导致重复访问;实际上可以统一处理。
    //若是平衡的,返回该树的高度,若不是平衡的,返回-1。key point
    //每隔结点只需要访问一次,O(n)
    private int isBalancedImp(TreeNode root){
    	if(root==null){
    		return 0;
    	}
    	int leftHeight=isBalancedImp(root.left);
    	if(leftHeight==-1){
    		return -1;
    	}
    	int rightHeight=isBalancedImp(root.right);
    	if(rightHeight==-1){
    		return -1;
    	}
    	if(Math.abs(leftHeight-rightHeight)>1){
    		return -1;
    	}
    	return Math.max(leftHeight, rightHeight)+1;
    }
}

参:http://blog.csdn.net/whoamiyang/article/details/51926985

    原文作者:B树
    原文地址: https://blog.csdn.net/away_lit/article/details/79600327
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞