第一时间想的是构造二叉树,然后利用每层对称的关系 ,求出父节点 var pathInZigZagTree = function(label) { let stack = [] for(let i = 1 ; i <= label ; i ++) { let level = Math.floor(Math.log(i) / Math.log(2)) if (!stack[level]) { …
用时 : 10min 利用前序遍历二叉树递增的性质解决 var minDiffInBST = function(root) { var min = Infinity var pre = null var dfs = function (root) { if (!root) return if (root.left) { dfs(root.left) } if (pre == null) { pre …
用时:10min 前序从上至下计算,没什么好说的 二进制转10 进制挺费劲的,我直接parseInt(path, 2) var sumRootToLeaf = function(root) { var ans = 0 var dfs = function (root,path) { if (!root) return path += root.val if (!root.left && …
用时: 偷偷看了答案 本来把问题想复杂了,想着维护一个最大堆,从上往下传递然后每次判断是否大于最大值 看了答案后发现只需要传递一个max,判断是否比max大,然后从下到上获取左右节点的值,返回左右节点和 加自身是否符合就好了 var goodNodes = function(root,max = root.val) { if (!root) return 0 var left = 0 max = …
用时:6min 很简单,中序遍历,计算两边子树是否存在 1 的值,没有就去掉。凡事左右子树或者自身包含 1 ,返回 true 。否则返回 false var pruneTree = function(root) { var DFS = function (root) { if (!root) return false var left = DFS(root.left) var right = …
看题型是求从根节点出发的,首先想到的是自顶向下的DFS,带着参数向下传递,结束条件没有左右儿子 直接前序遍历走起,可以认为是前面的节点都处理好了 var sumNumbers = function(root) { var ans = 0 var DFS = function (root,path) { if (!root) return path += root.val if …
用时:15min 用时:15min 拿到题的第一反应是是用递归,然后直接开始写了后发现 递归需要满足的条件是问题可以拆分成子问题,但是根据题意,我们需要求的是每个节点左右节点和的差值,这个 “左右节点和” 对于每个节点来说,都是不一样的问题 所以还是双递归 var findTilt = function(root) { var total = 0 var innerDFS = function …
用时 :30min 看懂题目的意思之后其实就能很快的做出来 题意是要求从任意节点出发的值,我们可以把每个节点的值求出来的过程中,选择最大的 又因为路径不能返回,可以知道我们出发的根节点的子节点的路径只能选择左或者右,或者都不要,结果为 x 求max 的时候再 把 x 和 左右都选的情况进行比较 var maxPathSum = function(root) { var max = …