给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
解题思路
先将链表转换成数组,再构造二叉搜索树
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedListToBST(ListNode head) {
ArrayList<Integer> list=new ArrayList<>();
while (head!=null)
{
list.add(head.val);
head= head.next;
}
int[] k=new int[list.size()];
for(int c=0;c<k.length;c++)
k[c]=list.get(c);
return sortedArrayToBST(k);
}
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length==0) return null;
return BST(nums,0,nums.length-1);
}
public TreeNode BST(int[] nums,int left,int right) {
if(left>right) return null;
if(left==right) return new TreeNode(nums[left]);
int mid=left+((right-left)>>1);
TreeNode treeNode=new TreeNode(nums[mid]);
treeNode.right=BST(nums,mid+1,right);
treeNode.left=BST(nums,left,mid-1);
return treeNode;
}
}
解题思路
通过快慢指针找链表的中点,进行递归
代码
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head==null) return null;
return helper(head,null);
}
public TreeNode helper(ListNode head,ListNode tail) {
if(head==tail) return null;
ListNode slow=head,fast=head;
while (fast!=tail&&fast.next!=tail)
{
fast=fast.next.next;
slow=slow.next;
}
TreeNode treeNode=new TreeNode(slow.val);
treeNode.right=helper(slow.next,tail);
treeNode.left=helper(head,slow);
return treeNode;
}
}