第108题:将有序数组转换成二叉搜索树

一. 问题描述

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0

     / \

   -3   9

   /   /

 -10  5

 

二. 解题思路

本题思路:采用二叉搜索树的特性+递归来进行求解,二叉树的根节点必定是有序数组的中间那个树,而数组左边则是左子树,右边是右子树,可采用递归进行求解。

步骤一:构建递归函数(左子树列表leftlist,右子树列表rightlist,根节点)。

步骤二:分别从左子树列表、和右子树列表中找到中间数代表根节点的左右子树。然后依次使用递归函数接着将左右子树作为根节点进行递归。

步骤三:当左子树和右子树列表都空的时候则返回。

三. 执行结果

执行用时 :7 ms, 在所有 java 提交中击败了6.13%的用户

内存消耗 :38.9 MB, 在所有 java 提交中击败了42.53%的用户

四. Java代码

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
         if(nums.length<=0) {
             TreeNode root=null ;
             return root;
         }else {
             int num=nums.length/2;
             List<Integer> leftlist=new ArrayList<Integer>();
             List<Integer> rightlist=new ArrayList<Integer>();
             for(int i=0;i<nums.length;i++) {
                 if(i<num)
                 leftlist.add(nums[i]);
                 if(i>num)
                 rightlist.add(nums[i]);
             }
            TreeNode root=new TreeNode(nums[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 11:35  fish大叔  阅读(414)  评论(0编辑  收藏  举报