/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */// 保存每个节点的父节点let parentMap = new Map();
// 递归遍历所有节点,并保存其父节点function dfs(node) { if (node.left) { // 如果子节点存在,则将其父节点保存到Map中 parentMap.set(node.left, node); // 继续递归遍历子节点 dfs(node.left); } if (node.right) { parentMap.set(node.right, node); dfs(node.right); }}/** * @param {TreeNode} root * @param {TreeNode} p * @param {TreeNode} q * @return {TreeNode} */var lowestCommonAncestor = function (root, p, q) { dfs(root); // 遍历二叉树的所有节点,保存其子父关系
// 用Set保存p的所有父节点 let visitedSet = new Set();
// 遍历并保存所有p的父节点 while (p) { // 每次遍历的p都是一个父节点,将其保存到Set中 visitedSet.add(p); // 不断在Map中查找p的父节点,并将其更新到p,用于下一次遍历 p = parentMap.get(p); }
// 遍历q的父节点,如果父节点已在visitedSet中保存过,则它就是最近公共祖先 while (q) { // 当第一次发现q在visitedSet中,那么它就是最近公共祖先,将其返回即可 if (visitedSet.has(q)) { return q; } // 每次遍历都查找q的父节点,并将其更新,继续循环 q = parentMap.get(q); }};
评论