给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)
递归:o(nlogn)
解题思路:
1.找到链表的中点mid,
2.记录mid前缀,断开链表
3.将mid放入到树中
4.递归head(左链表),mid.next(右链表)
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return TreeNode类
*/
//获取中间节点
public ListNode getmid(ListNode head){
ListNode slow=head;
ListNode fast=head;
ListNode pre_slow=null;//记录slow的前一个节点
//快慢指针获取中点
while(fast!=null&&fast.next!=null){
pre_slow=slow;
slow=slow.next;
fast=fast.next.next;
}
if(pre_slow!=null) pre_slow.next=null;//断开链表
return slow;
}
public TreeNode sortedListToBST (ListNode head) {
if(head==null){
return null;
}
ListNode mid=this.getmid(head);
//中间节点为树根节点
TreeNode node=new TreeNode(mid.val);
//如果只剩下一个节点,返回node
if(head==mid){
return node;
}
node.left=sortedListToBST(head);
node.right=sortedListToBST(mid.next);
return node;
}
}
给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)
1.判空
2.递归左子树,右子树
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param num int整型一维数组
* @return TreeNode类
*/
public TreeNode getBST(int[]num,int left,int right){
if(num==null ||num.length<=0|| left>right){
return null;
}
//取中点
int mid=left+(right-left+1)/2;
//只有一个节点
if(left==right){
return new TreeNode(num[left]);
}
//根节点
TreeNode root=new TreeNode(num[mid]) ;
//递归左子树
root.left=getBST(num,left,mid-1);
//递归右子树
root.right=getBST(num,mid+1,right);
return root;
}
public TreeNode sortedArrayToBST (int[] num) {
if(num==null ||num.length==0){
return null;
}
return getBST(num,0,num.length-1);
}
}