题目:
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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] 也是一个可行的构造方案。
简单介绍:
题目:将二叉搜索树变平衡
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的二叉搜索树标签。
解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.如何把二叉搜索树的点,添加到平衡二叉树上
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.设置一个空链表,保存保存中序遍历的二叉树结果
算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.递归实现中序遍历,结果存入链表。
2.利用链表,从中间开始构建平衡树。
代码部分:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.ArrayList;
public class Solution {
public TreeNode balanceBST(TreeNode root) {
ArrayList<Integer> list=new ArrayList<>();
//中序遍历构造链表
InOrder(root,list);
//以链表构造平衡树
return CreateBalanceBST(list,0,list.size()-1);
}
//中序遍历构造链表(左子树-》根-》右子树)
void InOrder(TreeNode root,ArrayList<Integer> list){
if(root!=null){
InOrder(root.left,list);
list.add(root.val);
InOrder(root.right,list);
}
}
//以链表构造平衡树
TreeNode CreateBalanceBST(ArrayList<Integer> list,int start,int end){
if(start>end) return null;
int mid=start+(end-start>>1);//>>右移运算符,优先级小于 - 。
TreeNode treeNode=new TreeNode(list.get(mid));
treeNode.left=CreateBalanceBST(list,start,mid-1);
treeNode.right=CreateBalanceBST(list,mid+1,end);
return treeNode;
}
}
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!