1382. 将二叉搜索树变平衡(中等)

1,问题描述

1382. 将二叉搜索树变平衡

难度:中等

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。

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

示例 1:

img

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

示例 2:

img

1
2
输入: root = [2,1,3]
输出: [2,1,3]

提示:

  • 树节点的数目在 [1, 104] 范围内。
  • 1 <= Node.val <= 105

2,初步思考

​ 直接取中间节点,将树分左右两支

3,代码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import support.TreeNode;

import java.util.ArrayList;
import java.util.List;

public class _1382将二叉搜索树变平衡 {

public TreeNode balanceBST(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return buildBST(res, 0, res.size() - 1);
}

private TreeNode buildBST(List<Integer> res, int left, int right) {
if (left > right) return null;
int mid = (left + right) >> 1;
TreeNode root = new TreeNode(res.get(mid));
root.left = buildBST(res, left, mid - 1);
root.right = buildBST(res, mid + 1, right);
return root;
}

private void inorder(TreeNode root, List<Integer> res) {// 中序遍历
if (root == null) return;
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
}