JavaScript | 二叉树中找到两个节点的最近公共祖先
在二叉树中找到两个节点的最近公共祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } */ /** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int整型 */ function lowestCommonAncestor( root , o1 , o2 ) { const node = traverse(root, o1, o2); return node?.val || null; } function traverse(root, o1, o2) { if(!root || root.val == o1 || root.val == o2) return root; const left = traverse(root.left, o1, o2); const right = traverse(root.right, o1, o2); if(!left && !right) return null; if(!left) return right; if(!right) return left; return root; } module.exports = { lowestCommonAncestor : lowestCommonAncestor };
思路:
这道题就是查找二叉树两个节点的最近公共祖先的通用解法,二叉树没说是二叉搜索树,所以不能用二叉搜索树的特性去搜索。
找公共祖先的通用解法: 后序遍历+回溯
function traverse(root, o1, o2) { // 递归终止条件 if(!root || root.val == o1 || root.val == o2) return root; // 后续遍历 const left = traverse(root.left, o1, o2); const right = traverse(root.right, o1, o2); // 处理中节点的时候,考虑下面几种情况: // 1. 左右子树都为空 不存在公共祖先 // 2. 左子树为空,公共祖先在右子树 // 3. 右子树为空,公共祖先在左子树 // 4. o1,o2 出现在两边,那么此时root就为公共祖先 if(!left && !right) return null; if(!left) return right; if(!right) return left; return root; }