zoukankan      html  css  js  c++  java
  • [LeetCode] 1382. Balance a Binary Search Tree

    Given the root of a binary search tree, return a balanced binary search tree with the same node values. If there is more than one answer, return any of them.

    A binary search tree is balanced if the depth of the two subtrees of every node never differs by more than 1.

    Example 1:

    Input: root = [1,null,2,null,3,null,4,null,null]
    Output: [2,1,3,null,null,null,4]
    Explanation: This is not the only correct answer, [3,1,4,null,2] is also correct.
    

    Example 2:

    Input: root = [2,1,3]
    Output: [2,1,3]

    Constraints:

    • The number of nodes in the tree is in the range [1, 104].
    • 1 <= Node.val <= 105

    将二叉搜索树变平衡。

    给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。

    如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。

    如果有多种构造方法,请你返回任意一种。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/balance-a-binary-search-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题几乎和108题一样。108题已经给定了一个排好序的数组,这道题对数组没有排序。

    既然我们处理的是一个二叉搜索树 BST,那么为了满足平衡的需求,我们首先需要将数组排序,把最中间的那个元素挑出来当做根节点,这样左右子树的节点个数才会平衡。然后我们再用类似108题的分治的做法,分别处理左右子树即可。

    时间O(n)

    空间O(n)

    Java实现

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode() {}
     8  *     TreeNode(int val) { this.val = val; }
     9  *     TreeNode(int val, TreeNode left, TreeNode right) {
    10  *         this.val = val;
    11  *         this.left = left;
    12  *         this.right = right;
    13  *     }
    14  * }
    15  */
    16 class Solution {
    17     List<TreeNode> sorted = new ArrayList<>();
    18 
    19     public TreeNode balanceBST(TreeNode root) {
    20         inorder(root);
    21         return helper(0, sorted.size() - 1);
    22     }
    23 
    24     private void inorder(TreeNode root) {
    25         if (root == null) {
    26             return;
    27         }
    28         inorder(root.left);
    29         sorted.add(root);
    30         inorder(root.right);
    31     }
    32 
    33     private TreeNode helper(int start, int end) {
    34         if (start > end) {
    35             return null;
    36         }
    37         int mid = start + (end - start) / 2;
    38         TreeNode root = sorted.get(mid);
    39         root.left = helper(start, mid - 1);
    40         root.right = helper(mid + 1, end);
    41         return root;
    42     }
    43 }

    相关题目

    108. Convert Sorted Array to Binary Search Tree

    109. Convert Sorted List to Binary Search Tree

    1382. Balance a Binary Search Tree

    LeetCode 题目总结

  • 相关阅读:
    gcc帮助资料搜找
    由去掉word文档中的一个GoLand复制后残留的底纹说起
    记录一些有趣网站的链接
    linux cpu调度算法发展过程
    啥叫内核线程-搜集
    了解了下啥叫cfs/bfs
    c++重载运算符两种形式的选择
    概念-乐观锁、悲观锁
    go 移位操作的简单自测-移33或65位
    Shell脚本:(delayexec)Cygwin下调用schtasks创建Windows任务计划,实现延迟或定时执行某一命令
  • 原文地址:https://www.cnblogs.com/cnoodle/p/15302881.html
Copyright © 2011-2022 走看看