本文最后更新于:2023年3月19日 晚上
Lt226.翻转二叉树、Lt100.相同的树、Lt104.二叉树的最大深度、Lt111.二叉树的最小深度
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (76.37%) |
557 |
- |
Tags
tree
Companies
Unknown
翻转一棵二叉树。
示例:
输入:
1 2 3 4 5
| 4 / \ 2 7 / \ / \ 1 3 6 9
|
输出:
1 2 3 4 5
| 4 / \ 7 2 / \ / \ 9 6 3 1
|
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们 90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
Discussion | Solution
思路
按照先序遍历模式交换左右节点即可
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
const { reverse } = require("core-js/fn/array");
var invertTree = function (root) { visit(root, null); return root; };
const visit = (node) => { if (!node) return null; reverse(node); visit(node.left); visit(node.right); };
const reverse = (node) => { let tmp = node.left; node.left = node.right; node.right = tmp; };
|
1 2 3 4
| Accepted 68/68 cases passed (96 ms) Your runtime beats 11.62 % of javascript submissions Your memory usage beats 5.42 % of javascript submissions (38.3 MB)
|
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (60.13%) |
463 |
- |
Tags
tree
| depth-first-search
Companies
bloomberg
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
1 2 3 4 5
| 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true
|
示例 2:
1 2 3 4 5
| 输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false
|
示例 3:
1 2 3 4 5
| 输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: false
|
Discussion | Solution
思路
按照递归的思想来进行深度遍历。如果两个节点都没有子节点则返回 true,如果两个节点其中一个不为空则返回 false,若两个节点都不为空,就轮流再比较左右节点。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
var isSameTree = function (p, q) { if (!p && !q) return true; else if (!p || !q) return false; return ( p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right) ); };
|
1 2 3 4
| Accepted 59/59 cases passed (68 ms) Your runtime beats 94 % of javascript submissions Your memory usage beats 27.28 % of javascript submissions (38 MB)
|
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (74.96%) |
688 |
- |
Tags
tree
| depth-first-search
Companies
apple
| linkedin
| uber
| yahoo
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
返回它的最大深度 3 。
Discussion | Solution
思路
对一个点来说,深度为左节点深度和右节点深度的最大值+1,如果这个点是叶子节点,则深度不再增加,返回 0
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
var maxDepth = function (root) { return root ? Math.max(maxDepth(root.left), maxDepth(root.right)) + 1 : 0; };
|
1 2 3 4
| Accepted 39/39 cases passed (92 ms) Your runtime beats 60.28 % of javascript submissions Your memory usage beats 20.88 % of javascript submissions (40.8 MB)
|
Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Easy (44.32%) |
358 |
- |
Tags
tree
| depth-first-search
| breadth-first-search
Companies
Unknown
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
返回它的最小深度 2.
Discussion | Solution
思路
对一个点来说,如果他有左节点和右节点,求最小深度,取两边节点深度小的那一个加一。如果他只有左节点或者右节点,取他左节点或者右节点的深度再加一。如果他没有左右节点,返回 1。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
var minDepth = function (root) { if (root) { if (!root.left && root.right) { return minDepth(root.right) + 1; } else if (root.left && !root.right) { return minDepth(root.left) + 1; } else { return Math.min(minDepth(root.left), minDepth(root.right)) + 1; } } else { return 0; } };
|
1 2 3 4
| Accepted 41/41 cases passed (92 ms) Your runtime beats 67.92 % of javascript submissions Your memory usage beats 64.71 % of javascript submissions (42 MB)
|