题目描述:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
思路:
1、选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差 1,可以使得树保持平衡。
2、确定平衡二叉搜索树的根节点之后,其余的数字分别位于平衡二叉搜索树的左子树和右子树中,左子树和右子树分别也是平衡二叉搜索树,因此可以通过递归的方式创建平衡二叉搜索树。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode treeNode= helpTree(nums,0,nums.length-1);
return treeNode;
}
private TreeNode helpTree(int[] nums, int left, int right) {
if (left>right) return null;
int mid=(left+right)/2;
TreeNode root=new TreeNode(nums[mid]);
root.left=helpTree(nums,left,mid-1);
root.right=helpTree(nums,mid+1,right);
return root;
}
}
题目描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
1、遍历链表,将得到的值放入到list中
2、从list中选出中间数作为根结点,分别对左右两棵子树进行递归建立二叉搜索树即可。
class Solution {
ArrayList<Integer> list=new ArrayList<>();
public TreeNode sortedListToBST(ListNode head) {
if(head==null){
return null;
}
allNode(head);
TreeNode root = helpBuild(list,0,list.size()-1);
return root;
}
//遍历有序链表放入list中
public void allNode(ListNode node){
while(true){
if(node==null){
break;
}else{
list.add(node.val);
node=node.next;
}
}
}
public TreeNode helpBuild(ArrayList<Integer> list,int left,int right){
if(left>right){
return null;
}
int mid=(left+right)/2;
TreeNode root=new TreeNode(list.get(mid));
root.left=helpBuild(list,left,mid-1);
root.right=helpBuild(list,mid+1,right);
return root;
}
}