面试经典150题——二叉搜索树

文章目录

  • 1、二叉搜索树的最小绝对差
    • 1.1 题目链接
    • 1.2 题目描述
    • 1.3 解题代码
    • 1.4 解题思路
  • 2、二叉搜索树中第 K 小的元素
    • 2.1 题目链接
    • 2.2 题目描述
    • 2.3 解题代码
    • 2.4 解题思路
  • 3、验证二叉搜索树
    • 3.1 题目链接
    • 3.2 题目描述
    • 3.3 解题代码
    • 3.4 解题思路


1、二叉搜索树的最小绝对差

1.1 题目链接

点击跳转到题目位置

1.2 题目描述

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

差值是一个正数,其数值等于两值之差的绝对值。

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

1.3 解题代码

/**
 * 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 {
    int min0 = 100005;
    int pre = -1;
    void dfs(TreeNode root){
        if(root == null){
            return ;
        }
        dfs(root.left);
        if(pre != -1){
            min0 = Math.min(min0, root.val - pre);
        }
        pre = root.val;
        dfs(root.right);
    }

    public int getMinimumDifference(TreeNode root) {
        dfs(root);
        return min0;
    }
}

1.4 解题思路

  1. 因为二叉搜索树的中序遍历结果是升序排序的,所以中序遍历后的结果,应当是相邻两个数之间取差值取最小值
  2. 每次维护中序遍历中上一次遍历到的节点,取差值即可。

2、二叉搜索树中第 K 小的元素

2.1 题目链接

点击跳转到题目位置

2.2 题目描述

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

提示:

  • 树中的节点数为 n 。
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

2.3 解题代码

/**
 * 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 {
    int res = 0;
    int num = 0;
    void dfs(TreeNode root, int k){
        if(root == null){
            return ;
        }
        dfs(root.left, k);
        num++;
        if(num == k){
            res = root.val;
            return ;
        }
        dfs(root.right, k);
    }

    public int kthSmallest(TreeNode root, int k) {
        dfs(root, k);
        return res;
    }
}

2.4 解题思路

  1. 二叉搜索树的中序遍历结果为递增的,所以第k小的元素就是中序遍历第第k个值。

3、验证二叉搜索树

3.1 题目链接

点击跳转到题目位置

3.2 题目描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树(treeName 树中的一个节点及其所有子孙节点所构成的树称为 treeName 的 子树。)只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

3.3 解题代码

/**
 * 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 {
    long pre = Long.MIN_VALUE;
    boolean res = true;

    void dfs(TreeNode root){
        if(root == null){
            return ;
        }
        dfs(root.left);
        if(pre != Long.MIN_VALUE){
            if(root.val <= pre){
                res = false;
                return;
            }
        }
        pre = root.val;
        dfs(root.right);
    }


    public boolean isValidBST(TreeNode root) {
        dfs(root);
        return res;
    }
}

3.4 解题思路

  1. 因为二叉搜索树的中序遍历是递增的,所以直接对搜索后的结果,判断是否递增即可。
  2. 核心思路与1、2两题相同。

你可能感兴趣的:(面试经典150题,面试,职场和发展,数据结构)