LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解

题目:

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

题解:

和我上面一篇将有序链表转成二叉排序树中用哈希表解的方法是一样的。基本思路:链表中间那个节点为树的根节点。根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点。后面就依照这个规律依次类推了。

public static TreeNode sortedArrayToBST(int[] nums) {
		 int end=nums.length;
		 if(end<=0)
			 return null;
		 return buildTree(nums, 0, end-1);//由于从0開始计数 所以减一

	    }
	 public static TreeNode buildTree(int[] nums,int start,int end)
	 {
		 if(start<=end)
		 {
			 int mid=(start+end)/2;
			 TreeNode root=new TreeNode(nums[mid]);
			 root.left=buildTree(nums, start, mid-1);
			 root.right=buildTree(nums, mid+1, end);
			 return root;
		 }
		 else {
			return null;
		}

	 }
时间: 2024-11-23 23:14:17

LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解的相关文章

笔试算法题(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

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

一. 问题描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3   9 /   / -10  5 二. 解题思路 本题思路:采用二叉搜索树的特性+递归来进行求解,二叉树的根节点必定是有序数组的中间那个树,而数组左边则是左

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

今天在网上看到一家公司的笔试题: 这里就不带大家看概念了,什么是二叉搜索树? 下面直接看代码 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--004--寻找两个有序数组的中位数(java)

转自https://blog.csdn.net/chen_xinjia/article/details/69258706 其中,N1=4,N2=6,size=4+6=10. 1,现在有的是两个已经排好序的数组,结果是要找出这两个数组中间的数值,如果两个数组的元素个数为偶数,则输出的是中间两个元素的平均值. 2,可以想象,如果将数组1随便切一刀(如在3和5之间切一刀),数组1将分成两份,数组1左别的元素的个数为1,右边的元素的个数为3. 由于数组1和数组2最终分成的左右两份的个数是确定的,都是所有

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

java 有序数组合并

有序数组合并,例如: 数组 A=[100, 89, 88, 67, 65, 34], B=[120, 110, 103, 79, 66, 35, 20] 合并后的结果 result=[120, 110, 103, 100, 89, 88, 79, 67, 66, 65, 35, 34, 20] 程序: import java.util.Arrays; public class Test { public static void main(String[] args) { int[] a = {

算法--两个有序数组合并

两个有序数组合并 关键点:从后往前进行比较,这样保证数组A有用的部分不会因为在合并的过程中覆盖掉 第15节 有序数组合并练习题 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class Merge {

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

算法练习:两指针之有序数组去重

问题描述 给出一个有序数组,就地移除重复元素,保持每个元素只出现一次,并返回新数组的长度. 问题分析 这个比较简单,直接使用两个指针,一个在前,一个在后,扫描一遍数组即可.时间复杂度为O(n^2). 比如数组A = { 1,1, 2, 3, 3 },看下图,思想简单明了. 代码实现 #include <iostream> using namespace std; //去除数组中重复的数字,返回新数组的长度 int RemoveDuplicate( int nArray[], int nCoun