diff --git "a/\344\272\214\345\217\211\346\240\221/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" "b/\344\272\214\345\217\211\346\240\221/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" new file mode 100644 index 0000000..5067d3c --- /dev/null +++ "b/\344\272\214\345\217\211\346\240\221/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" @@ -0,0 +1,57 @@ +let T = require("../工具/二叉树") + +let lowestCommonAncestor = function (root, p, q) { + let findAndCreate = (node, target, depth) => { + if (node !== target) { + let findInLeft + if (node.left) { + node.left.parent = node + findInLeft = findAndCreate(node.left, target, depth + 1) + } + + if (findInLeft) { + return findInLeft + } else { + if (node.right) { + node.right.parent = node + return findAndCreate(node.right, target, depth + 1) + } + } + } else { + return { + depth, + node, + } + } + } + + let findP = findAndCreate(root, p, 0) || {} + let findQ = findAndCreate(root, q, 0) || {} + + let cur = findP.depth > findQ.depth ? findQ.node : findP.node + + while (!(isAncestor(cur, p) && isAncestor(cur, q))) { + cur = cur.parent + } + + return cur +} + +function isAncestor(node, target) { + if (!node) { + return false + } + if (node !== target) { + return !!(isAncestor(node.left, target) || isAncestor(node.right, target)) + } else { + return true + } +} + +let l +let r +let t = new T(3) +t.left = l = new T(5) +t.right = r = new T(1) + +console.log(lowestCommonAncestor(t, l, r))