这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
83. 将有序数组转换为二叉搜索树 (convert-sorted-array-to-binary-search-tree)
标签
- BST
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例:
示例:
二叉树:nums = [-10,-3,0,5,9],
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
基本思路
BST和二叉树中序遍历 不熟的话 请移步 BST + 二叉树中序遍历
这题是个简单题,你只需知道这两点便可
- 二叉搜索树左子树上所有节点的值均小于它的根节点的值,右子树上所有节点的值均大于它的根节点的值
- 二叉搜索树的中序遍历结果为递增序列
写法实现
var sortedArrayToBST = function(nums) {
const buildBST = (nums, start, end) => {
if (start > end) {
return null
}
// 取中间数 作为根 这样就平衡了
let mid = start + Math.floor((end - start) / 2)
const root = new TreeNode(nums[mid]);
// 递归构建左右子树
root.left = buildBST(nums, start, mid - 1);
root.right = buildBST(nums, mid + 1, end);
return root
}
return buildBST(nums, 0, nums.length - 1)
};
84. 有序链表转换二叉搜索树 (convert-sorted-list-to-binary-search-tree)
标签
- BST
- 链表
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5],
它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
基本思路
基本思路根上题差不多。也是找到 mid ,然后分治来递归处理问题。只不过这次是链表操作
基本步骤
- 这次是链表,需要遍历下求长度
len - 同上题,写出
buildTree函数,这次没nums这么好用,传左右指针。 - 注意我们用中序遍历方式,
左,根,右来构建这棵树,我们用cur指针指向当前根,然后指针后移。注意左子树先用变量表示,后与根对接。 - 用 mid 来做构建左右子树的边界,递归去构建左右子树。
写法实现
var sortedListToBST = function(head) {
if (head === null) return null;
let [len, cur] = [0, head]
// 先求出总长度
while (head !== null) {
len++
head = head.next
}
const buildTree = (start, end) => {
// 递归出口
if (start > end) {
return null
}
// 中序遍历,先左子树,再根,再右子树
let mid = start + Math.floor((end - start) / 2)
// 先递归构建左子树,我们用变量保存
let left = buildTree(start, mid - 1)
// 再根
let root = new TreeNode(cur.val);
cur = cur.next
root.left = left
// 构建右子树
root.right = buildTree(mid + 1, end)
return root
}
return buildTree(0, len - 1)
};
另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧