zoukankan      html  css  js  c++  java
  • 第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);
             }
         }
    }
  • 相关阅读:
    asp.net core 中TagHelper使用
    vs2015 添加命令提示工具
    关于MVC中Start.cs文件的作用
    Sql Server的两个小技巧
    用vue.js重构订单计算页面
    用vue.js实现购物车功能
    一步步实现自己的ORM(五)
    一步步实现自己的ORM(四)
    将Object转换成Dictionary方法
    一步步实现自己的ORM(三)
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11833837.html
Copyright © 2011-2022 走看看