1. 题目描述

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

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

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

示例:
1382. 将二叉搜索树变平衡 - 图1
1382. 将二叉搜索树变平衡 - 图2

  1. 输入:root = [1,null,2,null,3,null,4,null,null]
  2. 输出:[2,1,3,null,null,null,4]
  3. 解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

提示:

  • 树节点的数目在 1 到 10 之间。
  • 树节点的值互不相同,且在 1 到 10 之间。

    2. 解题思路

    这个题目和108题的思路类似。

我们知道二叉搜索树的中序遍历是一个有序数组,那么我们就可以将题目给出的二叉搜索树进行中序遍历,将遍历得到的有序数组转化为平衡的二叉搜索树。其中后半部分和之前的解题思路完全一致。

3. 代码实现

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {TreeNode}
  11. */
  12. var balanceBST = function(root) {
  13. // 初始化一个数组用来储存中序遍历的结果
  14. const nums = []
  15. // 对二叉搜索树进行中序遍历
  16. function inorder(root){
  17. if(!root){
  18. return
  19. }
  20. inorder(root.left)
  21. nums.push(root.val)
  22. inorder(root.right)
  23. }
  24. // 将有序数组转化为高度平衡的二叉搜索树
  25. function buildAvl(low, high){
  26. if(low > high){
  27. return null
  28. }
  29. const mid = Math.floor(low+(high-low)/2)
  30. const cur = new TreeNode(nums[mid])
  31. cur.left = buildAvl(low, mid-1)
  32. cur.right = buildAvl(mid+1, high)
  33. return cur
  34. }
  35. inorder(root)
  36. return buildAvl(0, nums.length-1)
  37. };

4. 提交结果

1382. 将二叉搜索树变平衡 - 图3