这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
80. 二叉树的最大深度 (maximum-depth-of-binary-tree)
标签
- 二叉树的层序遍历
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
基本思路
这题异常简单,递归求左右子树最大深度就行了。
写法实现
var maxDepth = function(root) {
if (root === null) {
return 0
}
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
};
81. 从前序与中序遍历序列构造二叉树 (construct-binary-tree-from-preorder-and-inorder-traversal)
标签
- 二叉树的遍历
- 构造二叉树
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
给根据一棵树的前序遍历与中序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
基本思路
这篇思路来自于下面推荐文章的系列之一 [算法实践] 二叉树的遍历类型题实践(一)
对于任意一颗树而言,
- 前序遍历的形式总是
[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] - 中序遍历的形式总是
[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
- 构建一个二叉树需要构建三部分:root、左子树、右子树
- 左子树、右子树的构建,又包括:root、左子树、右子树
- 根据根节点的定位,划分出左/右子树的 [前序,中序] 数组,其实就是准备递归的参数
- 解题关键在于定位出根节点,划分出左右子树,然后递归构建左右子树
基本步骤
preorder的第一项肯定是根节点, 因为前序遍历的顺序是 [根 左 右]。- 由根节点,在
inorder[左 根 右] 中划分出属于左、右子树的inorder序列。 - 顺便我们得到了左右子树的节点个数,在
preorder中划分出左、右子树的preorder序列。 - 这样,我们得到左、右子树的
preorder和inorder序列,就可以递归去构建左、右子树,最终形成完整的一棵二叉树
写法实现
var buildTree = function(preorder, inorder) {
if (preorder.length === 0) {
return null
}
// 根据前序数组的第一个元素,就可以确定根节点
let root = new TreeNode(preorder[0])
// 定位根节点在中序遍历的midIndex
let midIndex = inorder.indexOf(root.val)
// 那么左边就是左子树节点个数,右子树节点个数都知道了,
// 左右子树的 (前序,中序)数组就都能搞出来了
root.left = buildTree(
preorder.slice(1, midIndex + 1), // 左子树的前序遍历
inorder.slice(0, midIndex) // 左子树的中序遍历
);
root.right = buildTree(
preorder.slice(midIndex + 1),
inorder.slice(midIndex + 1)
);
return root
};
81. 从中序与后序遍历序列构造二叉树 (construct-binary-tree-from-inorder-and-postorder-traversal)
标签
- 二叉树的遍历
- 构造二叉树
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
基本思路
同样这篇思路来自于下面推荐文章的系列之一 [算法实践] 二叉树的遍历类型题实践(一) 帮他点赞哈!
基本步骤
这题跟上题区别很小,直接看代码。
写法实现
var buildTree = function(inorder, postorder) {
let length = postorder.length
if (length === 0) {
return null
}
let root = new TreeNode(postorder[length - 1])
let midIndex = inorder.indexOf(root.val)
root.left = buildTree(
inorder.slice(0, midIndex),
postorder.slice(0, midIndex));
root.right = buildTree(
inorder.slice(midIndex + 1),
postorder.slice(midIndex, length - 1));
return root
};
另外你们可以看看大哥的下一个类似但又有些不同的
触类旁通!
另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧