236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
链接
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
var lowestCommonAncestor = function(root, p, q) { let res = null if (root === null) return res const nodeQues = [] nodeQues.push(root) let pNode = null let qNode = null while(nodeQues.length > 0) { const childNodes = nodeQues.splice(0) const childLen = childNodes.length if (pNode !== null && qNode !== null) break for(let i = 0; i < childLen;i++) { const node = childNodes[i] if (node) { if (node.val === p.val) { pNode = node } else if (node.val === q.val) { qNode = node } if (pNode !== null && qNode !== null) break if (node.left) { node.left.parent = node nodeQues.push(node.left) } if (node.right) { node.right.parent = node nodeQues.push(node.right) } } } } if (pNode === null || qNode === null || pNode.val === qNode.val) { return pNode ? pNode.val : qNode.val } const pNodeMap = {} while(pNode) { pNodeMap[pNode.val] = true pNode = pNode.parent } while(qNode) { if (pNodeMap[qNode.val]) { res = qNode console.log(pNodeMap[qNode.val], res) break } qNode = qNode.parent } return res }
|