mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-02-02 18:39:09 +08:00
160 lines
5.8 KiB
Markdown
160 lines
5.8 KiB
Markdown
<p align="center">
|
||
<a href="https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ"><img src="https://img.shields.io/badge/PDF下载-代码随想录-blueviolet" alt=""></a>
|
||
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
|
||
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
|
||
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
|
||
</p>
|
||
<p align="center"><strong>欢迎大家<a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||
|
||
|
||
# 1382.将二叉搜索树变平衡
|
||
|
||
[力扣题目链接](https://leetcode-cn.com/problems/balance-a-binary-search-tree/)
|
||
|
||
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
|
||
|
||
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
|
||
|
||
如果有多种构造方法,请你返回任意一种。
|
||
|
||
示例:
|
||
|
||

|
||
|
||
* 输入:root = [1,null,2,null,3,null,4,null,null]
|
||
* 输出:[2,1,3,null,null,null,4]
|
||
* 解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。
|
||
|
||
提示:
|
||
|
||
* 树节点的数目在 1 到 10^4 之间。
|
||
* 树节点的值互不相同,且在 1 到 10^5 之间。
|
||
|
||
# 思路
|
||
|
||
这道题目,可以中序遍历把二叉树转变为有序数组,然后在根据有序数组构造平衡二叉搜索树。
|
||
|
||
建议做这道题之前,先看如下两篇题解:
|
||
* [98.验证二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html) 学习二叉搜索树的特性
|
||
* [108.将有序数组转换为二叉搜索树](https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html) 学习如何通过有序数组构造二叉搜索树
|
||
|
||
这两道题目做过之后,本题分分钟就可以做出来了。
|
||
|
||
代码如下:
|
||
|
||
```CPP
|
||
class Solution {
|
||
private:
|
||
vector<int> vec;
|
||
// 有序树转成有序数组
|
||
void traversal(TreeNode* cur) {
|
||
if (cur == nullptr) {
|
||
return;
|
||
}
|
||
traversal(cur->left);
|
||
vec.push_back(cur->val);
|
||
traversal(cur->right);
|
||
}
|
||
// 有序数组转平衡二叉树
|
||
TreeNode* getTree(vector<int>& nums, int left, int right) {
|
||
if (left > right) return nullptr;
|
||
int mid = left + ((right - left) / 2);
|
||
TreeNode* root = new TreeNode(nums[mid]);
|
||
root->left = getTree(nums, left, mid - 1);
|
||
root->right = getTree(nums, mid + 1, right);
|
||
return root;
|
||
}
|
||
|
||
public:
|
||
TreeNode* balanceBST(TreeNode* root) {
|
||
traversal(root);
|
||
return getTree(vec, 0, vec.size() - 1);
|
||
}
|
||
};
|
||
```
|
||
|
||
# 其他语言版本
|
||
|
||
Java:
|
||
```java
|
||
class Solution {
|
||
ArrayList <Integer> res = new ArrayList<Integer>();
|
||
// 有序树转成有序数组
|
||
private void travesal(TreeNode cur) {
|
||
if (cur == null) return;
|
||
travesal(cur.left);
|
||
res.add(cur.val);
|
||
travesal(cur.right);
|
||
}
|
||
// 有序数组转成平衡二叉树
|
||
private TreeNode getTree(ArrayList <Integer> nums, int left, int right) {
|
||
if (left > right) return null;
|
||
int mid = left + (right - left) / 2;
|
||
TreeNode root = new TreeNode(nums.get(mid));
|
||
root.left = getTree(nums, left, mid - 1);
|
||
root.right = getTree(nums, mid + 1, right);
|
||
return root;
|
||
}
|
||
public TreeNode balanceBST(TreeNode root) {
|
||
travesal(root);
|
||
return getTree(res, 0, res.size() - 1);
|
||
}
|
||
}
|
||
```
|
||
Python:
|
||
```python
|
||
class Solution:
|
||
def balanceBST(self, root: TreeNode) -> TreeNode:
|
||
res = []
|
||
# 有序树转成有序数组
|
||
def traversal(cur: TreeNode):
|
||
if not cur: return
|
||
traversal(cur.left)
|
||
res.append(cur.val)
|
||
traversal(cur.right)
|
||
# 有序数组转成平衡二叉树
|
||
def getTree(nums: List, left, right):
|
||
if left > right: return
|
||
mid = left + (right -left) // 2
|
||
root = TreeNode(nums[mid])
|
||
root.left = getTree(nums, left, mid - 1)
|
||
root.right = getTree(nums, mid + 1, right)
|
||
return root
|
||
traversal(root)
|
||
return getTree(res, 0, len(res) - 1)
|
||
```
|
||
Go:
|
||
|
||
JavaScript:
|
||
```javascript
|
||
var balanceBST = function(root) {
|
||
const res = [];
|
||
// 中序遍历转成有序数组
|
||
const travesal = cur => {
|
||
if(!cur) return;
|
||
travesal(cur.left);
|
||
res.push(cur.val);
|
||
travesal(cur.right);
|
||
}
|
||
// 有序数组转成平衡二叉树
|
||
const getTree = (nums, left, right) => {
|
||
if(left > right) return null;
|
||
let mid = left + ((right - left) >> 1);
|
||
let root = new TreeNode(nums[mid]);// 中心位置作为当前节点的值
|
||
root.left = getTree(nums, left, mid - 1);// 递归地将区间[left,mid−1] 作为当前节点的左子树
|
||
root.right = getTree(nums, mid + 1, right);// 递归地将区间[mid+1,right] 作为当前节点的左子树
|
||
return root;
|
||
}
|
||
travesal(root);
|
||
return getTree(res, 0, res.length - 1);
|
||
};
|
||
```
|
||
|
||
|
||
|
||
-----------------------
|
||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
|
||
<div align="center"><img src=https://code-thinking-1253855093.file.myqcloud.com/pics/20210928153539.png width=500> </img></div>
|