码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-11-11 12:38:51      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:tle   div   public   结果   arraylist   color   构建   返回   递归   

一. 问题描述

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

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

 

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

标签:tle   div   public   结果   arraylist   color   构建   返回   递归   

原文地址:https://www.cnblogs.com/xiaobaidashu/p/11833837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!