第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);
         }
     }
}

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

时间: 2024-10-29 19:07:23

第108题:将有序数组转换成二叉搜索树的相关文章

LeetCode OJ:Convert Sorted Array to Binary Search Tree(将排序好的数组转换成二叉搜索树)

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 讲一个排序好的数组转换成二叉搜索树,这题没想出来,基本上是参考别人的,边界条件应该注意一下: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * T

有序数组转化成二叉搜索数

今天在网上看到一家公司的笔试题: 这里就不带大家看概念了,什么是二叉搜索树? 下面直接看代码 1 //an order arr to binary search tree 2 (function(){ 3 function main(arr){ 4 var node = {}; 5 if(arr.length <= 1) 6 return {data:arr[0]}; 7 var flag = Math.floor(arr.length/2); 8 node.data = arr[flag];

LeetCode--108--将有序数组转化为二叉搜索树

问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 思路:由于数组是有序数组,所以只需用二分法构造即可,mid即为根节点,0:mid 的中间点为左子树的根节点,mid+1:末尾的中间点为右子树

LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目标签:Tree 这道题目给了我们一个有序数组,从小到大.让我们把这个数组转化为height balanced BST. 首先来看一下什么是binary search tree: 每一个点的left < 节点 < right, 换一句话说,每一个点的值要大于左边的,小于右边的. 那么什么是heigh

把一维数组转换成二维数组

有一个一维数组,想把它变成m*n形式的二位数组, $arr = array(....); // 一维数组 $m = ceil(count($arr)/n); $array = array(); for ($i = 0, $j = 0; $i < $m; $i++) { for ($k = 0; $k < n; $k++) { $temp = $arr[$j++]; if($temp) $array[$i][$k] = $temp; } } 把一维数组转换成二维数组

判断数组是不是某二叉搜索树的后序遍历

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历.输入的数组的任意两个数字都不相同 分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历.首先要搞清搜索树的含义:跟结点大于左子树而小于右子树.其次,数组的最后一个结点一定是后序遍历的根节点.所以我们只要满足这两个条件,再通过递归就可以解出来了.代码如下: // 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream

笔试算法题(31):将有序数组转换成BST表示 &amp; 线段树的应用

出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元素,小于所有其右子树中的元素.对于排序数组而言,中间元素必然作为根节点,然后递归对由中间元素分割的左右数组部分进行处理: 解题: 1 struct Node { 2 int value; 3 Node *left; 4 Node *right; 5 }; 6 7 Node* Array2BST(in

[Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树

---恢复内容开始--- Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题目要求:转成高度平衡的二叉搜索树. 高度平衡的二叉搜索树:i)左子树和右子树的高度之差的绝对值不超过1; ii)树中的每个左子树和右子树都是AVL树; iii)每个节点都有一个平衡因子(balance factor bf),任一节点的平衡因子是1,0,

判断一个数组是否是二叉搜索树的后序遍历序列 24

引言 ? ? 继续二叉树,这个题考的知识点是二叉树的后续遍历 ? ? 分析问题 ? ? 对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列 ? ? 解决问题 ? ? 同样是用递归去做,首先要考虑Corner Case,如果array为空,那么返回false ? ? 然后找到根节点,根节点是array最