leetcode刷题日志-108/1382将有序数组转换为二叉搜索树/将二叉搜索树变平衡

由于这两道题思路极其类似,在此统一记录:

108题.将有序数组转换为平衡二叉搜索树
在这里插入图片描述
思路:给定的数组已经升序排列,而二叉搜索树中序遍历的结果就是升序,但是仅凭中序遍历不能确定一颗二叉树,但是题目只是说将升序序列转换为平衡二叉搜索树,且答案不唯一,所以不要求确定,如何平衡呢?我们尽量保证左右子树一样多的节点不就可以吗?那么我们就能通过每次取数组最中间的元素作为二叉树节点最终就能构建整个平衡二叉搜索树。

/**
 * 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 TreeNode sortedArrayToBST(int[] nums) {
        return dfs(nums,0,nums.length-1);
    }

    public TreeNode dfs(int[] nums, int lo, int hi){
        if(lo > hi) {
            return null;
        }

        int mid = lo + (hi - lo) / 2;//计算中间节点

        TreeNode root = new TreeNode(nums[mid]);
        root.left = dfs(nums,lo,mid - 1);//在数组左半边构建左子树
        root.right = dfs(nums,mid + 1,hi);//在数组右半边构建右子树
        return root;
    }

}

在这里插入图片描述
接下来看1382题,解法基本一样,不过多了一个步骤而已
1382.将二叉搜索树变平衡
在这里插入图片描述
思路:这里我们是有了一颗二叉搜索树,将树变平衡,我们有了二叉搜索树,那么就有了升序序列,有了升序序列,不就跟108题一样了吗?将有序数组转换为平衡二叉搜索树。获取升序序列就使用中序遍历记录即可,后面的操作就是使用升序序列构建二叉平衡树了。

/**
 * 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 TreeNode balanceBST(TreeNode root) {
        ArrayList<Integer> nums = new ArrayList<>();
        dfs(root,nums);//中序遍历获取升序序列
        return BSTDFS(nums,0,nums.size()-1);//使用升序序列构建平衡二叉搜索树
    }

    public void dfs(TreeNode root,ArrayList<Integer> nums){
        if(root == null) {
            return;
        }
        dfs(root.left,nums);
        nums.add(root.val);
        dfs(root.right,nums);
    }
    public TreeNode BSTDFS(ArrayList<Integer> nums,int lo,int hi) {
        if(lo > hi) {
            return null;
        }
        int mid = lo + (hi - lo) / 2;
        TreeNode root = new TreeNode(nums.get(mid));
        root.left = BSTDFS(nums, lo,mid- 1);
        root.right = BSTDFS(nums,mid+1,hi);
        return root;
    }
}

在这里插入图片描述

总结:解这两道题的关键在于要知道二叉搜索树的中序遍历是有序的!

最近更新

  1. TCP协议是安全的吗?

    2024-03-15 04:20:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-15 04:20:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-15 04:20:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-15 04:20:01       18 阅读

热门阅读

  1. 4. git 添加版本标签

    2024-03-15 04:20:01       21 阅读
  2. Oracle控制文件control file(1)控制文件概述

    2024-03-15 04:20:01       22 阅读
  3. 电子信息工程实践案例分析报告

    2024-03-15 04:20:01       20 阅读
  4. PHP伪协议详解

    2024-03-15 04:20:01       22 阅读
  5. LeetCode(力扣)算法题_2864_最大二进制奇数

    2024-03-15 04:20:01       19 阅读
  6. 2.Linux文件IO基础

    2024-03-15 04:20:01       20 阅读
  7. 查看Linux服务器配置

    2024-03-15 04:20:01       22 阅读
  8. leetcode:反转链表II 和k个一组反转链表的C++实现

    2024-03-15 04:20:01       22 阅读
  9. 网络学习DAY3--TCP并发

    2024-03-15 04:20:01       20 阅读
  10. LeetCode2864. Maximum Odd Binary Number

    2024-03-15 04:20:01       25 阅读
  11. 动态规划 Leetcode 494 目标和

    2024-03-15 04:20:01       20 阅读
  12. 缓存穿透和缓存击穿有什么区别?

    2024-03-15 04:20:01       22 阅读