Hi 你们好,我是张小猪。欢迎来到『宝宝也能看懂』系列特别篇 - 官方小活动 『30-Day LeetCoding Challenge』。node
这里是 4 月 11 号的题,也是题目列表中的第 543 题 -- 『二叉树的直径』git
给定一棵二叉树,你须要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。github
示例 :shell
给定二叉树 1 / \ 2 3 / \ 4 5
返回 __3__, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。segmentfault
注意: 两结点之间的路径长度是以它们之间边的数目表示。优化
EASYspa
题目的需求是求一颗二叉树的直径。第一眼看起来彷佛有些不知道如何下手,不过咱们尝试把这个问题拆解开来。站在一个节点的视角上看来这个目标,那其实只有两种状况:code
经过这种方式,咱们成功的把目标拆解为了比较简单的小目标。而后咱们只须要找到方法求出子树的高度便可。blog
经过深度优先遍历,咱们能够轻松的求得某个子树的高度。为了不大量的重复计算,咱们能够用一个 map 把运算的结果进行暂存。最后再结合上面的思路,咱们能够获得相似下面的代码:leetcode
const diameterOfBinaryTree = root => { const cache = new Map(); let max = 0; dfs(root); return max; function dfs(node) { if (!node) return 0; if (cache.has(node)) return cache.get(node); const r = dfs(node.right); const l = dfs(node.left); if (max < r + l) max = r + l; cache.set(node, Math.max(r, l) + 1); return Math.max(r, l) + 1; } };
分析的过程其实就是尝试把一个大目标拆分红不少的小目标来处理。而对于二叉树,咱们经常使用的经典的遍历方式例如深度优先遍历,再结合 memo 来作一点优化。但愿能帮助到有须要的小伙伴。
若是以为不错的话,记得『三连』哦。小猪爱大家哟~