一. 问题描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/
-3 9
/ /
-10 5
二. 解题思路
本题思路:本题与第108题思路一样,只不过在一开始将链表转换成list,然后采用相同的步骤进行计算,具体参考第108题。
三. 执行结果
执行用时 :10 ms, 在所有 java 提交中击败了7.12%的用户
内存消耗 :39.5 MB, 在所有 java 提交中击败了95.51%的用户
四. Java代码
class Solution { public TreeNode sortedListToBST(ListNode head) { if(head==null) { TreeNode root=null ; return root; }else { List<Integer> list=new ArrayList<Integer>(); while(head!=null) { list.add(head.val); head=head.next; } int num=list.size()/2; List<Integer> leftlist=new ArrayList<Integer>(list.subList(0, num)); List<Integer> rightlist=new ArrayList<Integer>(list.subList(num+1,list.size())); TreeNode root=new TreeNode(list.get(num)); getTree(leftlist,rightlist,root); return root; } } public void getTree(List<Integer> leftlist,List<Integer> rightlist,TreeNode root) { if(leftlist.size()==0&&rightlist.size()==0) { return; } if(leftlist.size()>0) { int leftnum=leftlist.size()/2; List<Integer> newleftlist=new ArrayList<Integer>(leftlist.subList(0, leftnum)); List<Integer> newleftlistright=new ArrayList<Integer>(leftlist.subList(leftnum+1, leftlist.size())); root.left=new TreeNode(leftlist.get(leftnum)); getTree(newleftlist,newleftlistright,root.left); } if(rightlist.size()>0) { int rightnum=rightlist.size()/2; List<Integer> newrightlistleft=new ArrayList<Integer>(rightlist.subList(0, rightnum)); List<Integer> newrightlistright=new ArrayList<Integer>(rightlist.subList(rightnum+1, rightlist.size())); root.right=new TreeNode(rightlist.get(rightnum)); getTree(newrightlistleft,newrightlistright,root.right); } } }