第109题:有序链表转换二叉搜索树

一. 问题描述

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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);
         }
     }
    
}

 

posted @ 2019-11-11 12:54  fish大叔  阅读(131)  评论(0编辑  收藏  举报