当前位置: 首页 > article >正文

搜索二叉树(增删查)

搜索二叉树(增删查)

  • 验证搜索二叉树
  • 二叉搜索树中的插入操作
  • 删除指定节点(难)

验证搜索二叉树

题目链接

在这里插入图片描述

这个题目很坑,不是只比较每个节点的左右孩子满足左小右大,而是整棵树!,知道BST的中序遍历是有序的,思路打开,可以中序遍历二叉树然后判断结果是不是有序的,有序就是搜索二叉树,否则不是。有两个方法:①可以用一个变量max来记录最大值 ②遍历过程中直接比较前后节点

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //方法二:遍历过程中,前后节点比较
    public boolean isValidBST(TreeNode root) {
       return traverse(root);
    }
    TreeNode preNode=null;
    //二叉树的分解思路
    //定义:判以root为根的是是不是搜索二叉树
    boolean traverse(TreeNode root){
        if(root==null){
            return true;
        }   
        //判断左子树是不是搜索二叉树
        boolean left= traverse(root.left);
        //前一个节点与当前节点的比较
        if(preNode!=null&&preNode.val>=root.val){
        return false;
        }
        preNode=root;//第二次来root节点,记录此时节点作为前一个节点,继续往后遍历
        //判断右子树是不是搜索二叉树
        boolean right= traverse(root.right);

        return left&&right;
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //方法一:增加一个变量max
    public boolean isValidBST(TreeNode root) {
       return traverse(root);
    }
    long  max=Long.MIN_VALUE;
    //二叉树的分解思路
    //定义:判以root为根的是是不是搜索二叉树
    boolean traverse(TreeNode root){
        if(root==null){
            return true;
        }   
        
       boolean left= traverse(root.left);

        if(max<root.val){
            max=root.val;
        }else{
            return false;
        }

        boolean right= traverse(root.right);

        return left&&right;
    }
}

二叉搜索树中的插入操作

题目链接在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //二叉树分解的思路
    //定义:在root为根的树中插入一个val节点
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null){
            return new TreeNode(val);
        }
        if(root.val<val){
            //去右子树插入val节点,将插好的树接到root的右子树上
           root.right = insertIntoBST(root.right,val);
        }
        if(root.val>val){
            //去左子树插入val节点,将插好的树接到root的左子树上
            root.left=insertIntoBST(root.left,val);
        }
        //最后返回root节点即可
        return root;
    }
}

删除指定节点(难)

题目链接
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //首先找到要删的节点
    //判断节点的孩子,有三种情况,①没有孩子②只有子树③有左右子树
    //deleteNode()定义:删除root为根的树中节点为k的节点
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root==null){
            return null;
        }
        if(root.val<key){
            //去右子树删
           root.right= deleteNode(root.right,key);
        }
        if(root.val>key){
            //去左子树删
           root.left= deleteNode(root.left,key);
        }
        //找到了目标节点
        if(root.val==key){
            // 排除了情况 1 之后
            if (root.left == null) {
            return root.right;
            }
            if (root.right == null){
            return root.left;
            } 
            //有左子树和右子树,先找右子树中最小的节点min
           TreeNode min= findMin(root.right);
           //然后将最小值赋给root
           root.val=min.val;
           //最后删除最小节点min
           root.right= deleteNode(root.right,min.val);
        }
            
        return root;
    }

    TreeNode findMin(TreeNode root){
    TreeNode min=root;
        while(root.left!=null){
            min=root.left;
            root=min;
        }
        return min;
    }
}

http://www.kler.cn/a/409737.html

相关文章:

  • jdk-VarHandle 翻译
  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • Vue进阶面试题目(一)
  • vue项目中中怎么获取环境变量
  • 算法训练-双指针
  • spring源码解析-@Autowired
  • Linux——Uboot命令使用
  • git提交到远程仓库如何撤回?
  • Stable Diffusion 3 部署笔记
  • 开源电话机器人产品的优点是什么?
  • Linux系统中查看当前使用的显示管理器
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块
  • 电子应用设计方案-24:智能防火系统方案设计
  • XSS 与 CSRF 记录
  • 第一次shell作业
  • 民宿预定管理系统|Java|SSM|Vue| 前后端分离
  • 打造智能扩容新纪元:Kubernetes Custom Metrics深度解析
  • 使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介
  • 记录eslint报错的情况
  • Leetcode141. 环形链表(HOT100)
  • 字符串编码
  • 数组的应用
  • Burp学习(1)
  • 【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?
  • 【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖
  • 搭建帮助中心,打造卓越的用户体验