给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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;}
}