标题信息

标题地址:leetcode-cn.com/problems/co…

将一个按照升序摆放的有序数组,转换为一棵高度平衡二叉查找树

本题中,一个算法剖析的意图是度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超越 1。

示例:

给定有序数组: [-10,-3,0,5算法的时刻复杂度取决于什么,9],

一个或许的答案是:[0,-3,数据结构包括哪三方面9,-10,null,5],它能够标明下面这个高度平衡二叉查找树:

      0
/ 
-3   9
/   /
-10  5

题解:递归(中序)

一个升序数组,转二叉树仍是并且是查找树(右子树小左子树),因而这个数组恰当所以查找树的中序遍历

关于示例的数组:[-10,-3,0,5,9],转化为二叉查找树结果是有许多

比如:

      0
/ 
-3   5
/     
-10      9
      5
/ 
-3   9
/ 
-10  0

标题当时是要得高度平衡的一个解(因而上面一个解是不满意的平衡的),因而尽量取中心作为根,就是最平衡的。

LeetCode日常之树:108 将有序数组转为二叉树

算法剖析的两个首要方面是如是偶数,取中心的两个恣意的。数据结构知识点总结如下要么-10为当时根-算法动画图解3为它的左子节点,要么-3为当时根-10为它的右子节点

LeetCode日常之树:108 将有序数组转为二叉树

因而咱们能够推数据结构与算法出递归

public TreeNode sortedArrayToBST(int[] nums) {
return recurrence(nums, 0, nums.length - 1);
}
//取根
publi数组公式c Tre算法剖析的两个首要方面是eNode recurrence(int[] nums, int left, int right) {
if (left &leetcode刷题攻略gt; right) return null;
// 除法运算向下取整,所以偶数取左边
int mid = (left + right) / 2;
// 取到根节点
TreeNode root = new TreeNode(nums[mid]);
// 再判别左右两个树,取哪个根
roo算法的时刻复杂度取决于什么t.lefLeetCodet = recurrence(nums, left, mid - 1);
ro数组指针ot.right = recurrence(nums, mid + 1, right);
return root;
}

时刻复杂度当leetcode刷多少题找到作业然是O(n),平衡的原因栈的深度为log2n因而空间复杂度为O(logn)

LeetCode日常之树:108 将有序数组转为二叉树

总结

全体来说仍是比较好想的一个二分的这样一个东西,标题是求出满意条件的一解

i数组c语言nt mid = (left + right) / 2;

这样取就得到的就是遇偶数取左边的解,假设加个1之后再除2就是取右了,或许加个随机数(0/1)。这样能够每次执行得到满意条件的树或许都不相同。

数组去重的5种方法后初级合集关于树这一章也完毕了也是算法导论这个合集整个数据结构的华章完毕了,数组排序从初步对树这样的结构很生算法疏仅算法规划与剖析仅遍历操作就与线性数据结构有很大不同,到现在虽然短短5题现已对这样一个数据结构更了解了。算法是什么从下个章节初步的就是关于算法思想向的华章(排序、动态规划、数学等等数组函数的使用方法