leetcode 力扣 1285 将二叉搜索树变平衡 题解 算法题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:将二叉搜索树变平衡
给你一棵二叉搜索树,请你返回一棵平衡后的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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 之间。
语言:C++
class Solution {
public:
vector<int> inorderSeq;
void getInorder(TreeNode* o) {
if (o->left) {
getInorder(o->left);
}
inorderSeq.push_back(o->val);
if (o->right) {
getInorder(o->right);
}
}
TreeNode* build(int l, int r) {
int mid = (l + r) >> 1;
TreeNode* o = new TreeNode(inorderSeq[mid]);
if (l <= mid - 1) {
o->left = build(l, mid - 1);
}
if (mid + 1 <= r) {
o->right = build(mid + 1, r);
}
return o;
}
TreeNode* balanceBST(TreeNode* root) {
getInorder(root);
return build(0, inorderSeq.size() - 1);
}
};
语言:Java
class Solution {
List<Integer> inorderSeq = new ArrayList<Integer>(); public TreeNode balanceBST(TreeNode root) {
getInorder(root);
return build(0, inorderSeq.size() - 1);
}
public void getInorder(TreeNode o) {
if (o.left != null) {
getInorder(o.left);
}
inorderSeq.add(o.val);
if (o.right != null) {
getInorder(o.right);
}
}
public TreeNode build(int l, int r) {
int mid = (l + r) >> 1;
TreeNode o = new TreeNode(inorderSeq.get(mid));
if (l <= mid - 1) {
o.left = build(l, mid - 1);
}
if (mid + 1 <= r) {
o.right = build(mid + 1, r);
}
return o;
}
}
语言:Python
class Solution:
def balanceBST(self, root: TreeNode) -> TreeNode:
def getInorder(o):
if o.left:
getInorder(o.left)
inorderSeq.append(o.val)
if o.right:
getInorder(o.right)
def build(l, r):
mid = (l + r) //2
o = TreeNode(inorderSeq[mid])
if l <= mid -1:
o.left = build(l, mid -1)
if mid +1<= r:
o.right = build(mid +1, r)
return o
inorderSeq = list()
getInorder(root)
return build(0, len(inorderSeq) -1)
语言:javascript
/**
* @param{TreeNode} root
* @return {TreeNode}
*/
var balanceBST =function (root) {
const traverse = (root) => {
let res = [];
if (root ==null) return res;
res.push(...traverse(root.left));
res.push(root.val);
res.push(...traverse(root.right));
return res;
};
const build = (nums, low, high) => {
// BST 构造函数,见 108. 将有序数组转换为二叉搜索树if (low > high) return null;
let mid = low + ((high - low) >>1);
return new TreeNode(
nums[mid],
build(nums, low, mid -1),
build(nums, mid +1, high)
);
};
// 中序遍历获取有序数组
let nums =traverse(root);
// 从有序数组构建 BST(前闭后闭区间)
return build(nums,0, nums.length-1);
};
语言:php
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; } * }
*/
class S olution {
private$arr=[];
/**
* @param TreeNode $root
* @return TreeNode
*/
function balanceBST($root) {
$this->travel($root);
$len=sizeof($this->arr);
return$this->build(0,$len-1);
}
function build($l,$r){
if($l>$r){
return null;
}
if($l==$r)
return new T reeNode($this->arr[$l]);
$mid=floor(($r-$l)/2)+$l;
$node=new T reeNode($this->arr[$mid]);
$node->left=$this->build($l,$mid-1);
$node->right=$this->build($mid+1,$r);
return$node;
}
function travel($root){
if($root){
$this->travel($root->left);
$this->arr[]=$root->val;
$this->travel($root->right);
}
}
}
语言:golang
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func balanceBST(root *TreeNode) *TreeNode {
data := []int{}
var mdfs func (*TreeNode)
mdfs = func(nd *TreeNode){
if nd==nil{return}
mdfs(nd.Left)
data = append(data, nd.Val)
mdfs(nd.Right)
}
mdfs(root)
var buildTree func([]int)*TreeNode
buildTree = func(data []int)*TreeNode{
if len(data)<=0{return nil}
h := (len(data)-1)/2
rt := TreeNode{data[h],nil,nil}
if h>0{rt.Left=buildTree(data[:h])}
if h<len(data)-1{rt.Right=buildTree(data[h+1:])} return &rt
}
return buildTree(data)
}
语言:golang
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func balanceBST(root *TreeNode) *TreeNode {
nums := []int{}
var midTraver func(node *TreeNode)
midTraver = func(node *TreeNode) {
if node == nil {
return
}
midTraver(node.Left)
nums = append(nums, node.Val)
midTraver(node.Right)
}
midTraver(root)
sort.Ints(nums)
newRoot := midTra(nums)
return newRoot
}
func midTra(nums []int) *TreeNode {
if len(nums) == 0 {
return nil
}
val := nums[len(nums)/2]
var node = &TreeNode{
Val: val,
Left: nil,
Right: nil,
}
node.Left = midTra(nums[0:len(nums)/2]) node.Right = midTra(nums[len(nums)/2+1:]) return node
}
语言:golang
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func balanceBST(root *TreeNode) *TreeNode { nums := []int{}
var midTraver func(node *TreeNode)
midTraver = func(node *TreeNode) {
if node == nil {
return
}
midTraver(node.Left)
nums = append(nums, node.Val)
midTraver(node.Right)
}
midTraver(root)
sort.Ints(nums)
newRoot := midTra(nums)
return newRoot
}
func midTra(nums []int) *TreeNode {
if len(nums) == 0 {
return nil
}
val := nums[len(nums)/2]
var node = &TreeNode{
Val: val,
Left: nil,
Right: nil,
}
node.Left = midTra(nums[0:len(nums)/2]) node.Right = midTra(nums[len(nums)/2+1:]) return node
}。