BST | 二叉搜索树的基本操作(Java)

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BST | 二叉搜索树的基本操作(Java)相关的知识,希望对你有一定的参考价值。

二叉搜索树 (BST),是一种很常用的二叉树。它的定义时:一个二叉树中,任意节点的值要>=左子树所有节点的值,而且<=右子树的所有节点的值。
本文主要介绍BST的基本操作:判断合法性,增,删,改,查。

1.构建二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵高度平衡 二叉搜索树
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

分析问题:
根据递归的思路,本质上就是寻找分割点,分割点作为当前节点,然后递归左区间和又区间。 根据题目是升序,可以联想到中序遍历
给定二叉搜索树的中序遍历,是否可以唯一地确定二叉搜索树?答案是否定的。如果没有要求二叉搜索树的高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个。

如果增加一个限制条件,即要求二叉搜索树的高度平衡,是否可以唯一地确定二叉搜索树?答案仍然是否定的。

直观地看,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差 1,可以使得树保持平衡。 如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择不同的数字作为根节点则创建的平衡二叉搜索树也是不同的。

解法:中序遍历
选择任意一个中间位置数字作为根节点,则根节点的下标为mid = (left+right)/2mid = (left+right+1)/2两者中随机选择一个,此处的除法为整数除法。

class Solution {
    Random rand = new Random();

    public TreeNode sortedArrayToBST(int[] nums) {
        return bst(nums, 0, nums.length - 1);
    }

    // left:0 rigth:length-1 定义左右指针
    public TreeNode bst(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }

        // 选择任意一个中间位置数字作为根节点 
        int mid = (left + right + rand.nextInt(2)) / 2;  //0,1
        TreeNode root = new TreeNode(nums[mid]);
        root.left = bst(nums, left, mid - 1); 
        root.right = bst(nums, mid + 1, right); 
        return root;
    }
}

2.判断BST的合法性

root需要做的不只是和左右节点比较,而是要和整棵左子树和右子树所有节点比较。
对于这种情况可以使用辅助函数,增加函数参数列表,在参数中携带额外信息:

boolean isValidBST(TreeNode root){
	return isValidBST(root,null,null);
}
boolean isValidBst(TreeNode root,TreeNode min, TreeNode max){
	if(root == null){return true;}
	if(min != null && root.val <= min.val){return false;}
	if(max != null && root.val >= max.val){return false;}
	return isValidBst(root.left,min,root)&& isValidBST(root.right,root,max);
}

相当于给子树上的所有节点添加了一个minmax边界,约束root的左子树节点值不超过root的值,右子树节点值不小于root的值,也就符合BST定义。

…待更新…

以上是关于BST | 二叉搜索树的基本操作(Java)的主要内容,如果未能解决你的问题,请参考以下文章

二叉搜索树的操作集

数据结构-1 二叉搜索树的操作集

二叉搜索树的删除操作详解(BST)

树--04---二叉树--01---简介二叉搜索树(BST)实现

二叉搜索树的插入,删除,和中序遍历

二叉搜索树的插入与删除(C语言)