108. 将有序数组转换为二叉搜索树

复制代码
https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/?envType=study-plan-v2&envId=top-interview-150

这题考察的就是平衡二叉树的构建,所以需要掌握这部分的知识,如果对这方面知识有所欠缺的话可以看一下这篇博客:二叉搜索树/平衡二叉搜索树-CSDN博客

推销一下自己写的文章,我觉得我写的还是很详细的,认真看完的话这题就没什么问题了。

java 复制代码
class Solution {
    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;
        }
    }
    public TreeNode sortedArrayToBST(int[] nums) {
        TreeNode root = null;
        for(int i = 0; i < nums.length; i++) {
            root = addNode(root, nums[i]);
        }
        return root;
    }

    //计算树的高度
    public int height(TreeNode node) {//叶节点的高度为1
        if(node == null) return 0;
        return Math.max(height(node.left), height(node.right)) + 1;
    }
    //计算平衡因子(左子树的高度 - 右子树的高度)
    public int balanceFactor(TreeNode node) {
        return height(node.left) - height(node.right);
    }

    //左旋
    public TreeNode leftRotate(TreeNode node) {
        TreeNode right = node.right;
        node.right = null; // 断开连接,不然会产生环
        if(right.left != null) node.right = right.left;
        right.left = node;
        return right;
    }
    //右旋
    public TreeNode rightRotate(TreeNode node) {
        TreeNode left = node.left;
        node.left = null; // 断开连接,不然会产生环
        if(left.right != null) node.left = left.right;
        left.right = node;
        return left;
    }

    //添加节点
    public TreeNode addNode(TreeNode node, int val) {
        if(node == null) {
            return new TreeNode(val);
        }
        if(val < node.val) node.left = addNode(node.left, val);
        else if(val > node.val) node.right = addNode(node.right, val);
        // 插入节点后检查是否需要平衡调整
        int balanceFactor = balanceFactor(node);
        if(balanceFactor > 1 && val < node.left.val) {//LL情况->右旋,node是被破坏节点,加入节点是破坏节点
            return rightRotate(node);
        }
        if(balanceFactor < -1 && val > node.right.val) {//RR情况->左旋
            return leftRotate(node);
        }
        if(balanceFactor > 1 && val > node.left.val) {//LR情况->被破坏节点的左节点左旋,被破坏节点右旋
            node.left = leftRotate(node.left);
            return rightRotate(node);
        }
        if(balanceFactor < -1 && val < node.right.val) {//RL情况->被破坏节点的右节点右旋,被破坏节点左旋
            node.right = rightRotate(node.right);
            return leftRotate(node);
        }
        return node;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {-10,-3,0,5,9};
        solution.sortedArrayToBST(nums);
    }
}
相关推荐
天河归来10 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
砚底藏山河12 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊12 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子13 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质13 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
夜不会漫长13 小时前
C++:红黑树
数据结构·算法
云创智城-yuncitys13 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
文丑颜不良啊13 小时前
LeetCode1661~1680题目解析
java·leetcode
子非鱼@Itfuture13 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端