深圳幻海软件技术有限公司 欢迎您!

数据结构与算法:二叉搜索树

2023-04-21

✨数据结构与算法:二叉搜索树🍊1.二叉搜索树的概念🍊2.二叉搜索树中的查找🍊3.二叉搜索树的插入🍊4.删除二叉搜索树中的一个节点(较复杂)🍊5.判断是不是二叉搜索树(易错)🍊结束语📃个人主页:不断前进的皮卡丘🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记

✨数据结构与算法:二叉搜索树

  • 🍊1. 二叉搜索树的概念
  • 🍊2.二叉搜索树中的查找
  • 🍊3.二叉搜索树的插入
  • 🍊4.删除二叉搜索树中的一个节点(较复杂)
  • 🍊5.判断是不是二叉搜索树(易错)
  • 🍊结束语

📃 个人主页: 不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 牛客网刷题神器

🍊1. 二叉搜索树的概念

🎈二叉搜索树又叫做二叉排序树,它具有下面的几个性质:
1️⃣若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2️⃣若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3️⃣它的左、右子树也分别为二叉排序树

🍊2.二叉搜索树中的查找

给定一棵二叉搜索树,以及一个值val,如果二叉搜索树中存在值和val相同的节点,则返回这个节点,否则返回null

public TreeNode searchBST(TreeNode root, int val) {
        if(root==null) return null;
        TreeNode curr=root;
        while(curr!=null){
            if(curr.val==val){
                return curr;
            }else if(curr.val<val){
                curr=curr.right;
            }else{
                curr=curr.left;
            }
        }
        //循环外面说明没有找到
        return null;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

🍊3.二叉搜索树的插入

NC372 插入二叉搜索树

二叉搜索树的插入需要考虑下面几种情况

1️⃣根节点为空,那么待插入的节点就作为二叉搜索树的根节点
2️⃣根节点非空,则找到待插入的位置

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param val int整型 
     * @return TreeNode类
     */
    public TreeNode insertToBST (TreeNode root, int val) {
        // write code here
        if(root==null) return new TreeNode(val);
        TreeNode curr=root;
        TreeNode parent=null;
        while(curr!=null){
            if(curr.val==val){
                break;
            }else if(curr.val<val){
                parent=curr;
                curr=curr.right;
            }else{
                parent=curr;
                curr=curr.left;
            }
        }
        if(curr==parent.left){
            parent.left=new TreeNode(val);
        }else{
            parent.right=new TreeNode(val);
        }
         
        return root;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

🍊4.删除二叉搜索树中的一个节点(较复杂)

NC297 删除一个二叉搜索树中的节点

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param key int整型 
     * @return TreeNode类
     */
     public TreeNode deleteNode(TreeNode root, int key) {
        root = delete(root,key);
        return root;
    }

    private TreeNode delete(TreeNode root, int key) {
        if (root == null) return null;

        if (root.val > key) {
            root.left = delete(root.left,key);
        } else if (root.val < key) {
            root.right = delete(root.right,key);
        } else {
            if (root.left == null) return root.right;
            if (root.right == null) return root.left;
            TreeNode tmp = root.right;
            while (tmp.left != null) {
                tmp = tmp.left;
            }
            root.val = tmp.val;
            root.right = delete(root.right,tmp.val);
        }
        return root;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

🍊5.判断是不是二叉搜索树(易错)

NC184 判断是不是二叉搜索树

判断是不是二叉搜索树,就是看这棵二叉树是否满足二叉搜索树的性质,当二叉搜索树进行中序遍历的时候,它们的节点的值是按照从小到大排序的,我们可以利用这个性质来解答。

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
      long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
        // 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
        if (root.val <= pre) {
            return false;
        }
        pre = root.val;
        // 访问右子树
        return isValidBST(root.right);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

🍊结束语

希望大家可以自己动手练习一下,算法光看是不行的,必须亲自动手敲代码,有时候你会发现自己有思路,但是又写不出来,这就是缺乏练习的原因。大家平时在做题的时候,可以多思考,多总结。
刚开始的时候,我们可能遇到一种新的题型,完全没有思路的时候,其实可以先去看看别人的思路,还有题解,把它理解下来,然后把代码敲出来(不要复制粘贴,我们根据自己的理解敲出代码这样才有效果,如果中途卡住了,也可以再回过头去看看)
另外,为了检测一下我们是否真正的掌握,我们可以去做几道相似的题目巩固一下,顺便检验一下自己的成果。
点此跳转去练习

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44672 人正在系统学习中