We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。 示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先通过 DFS 去找到 p 和 q 节点的深度,并且在查找的过程中对节点和他们的子节点之间建立父子关系。
之后,从深度最浅的那个节点开始(深度浅,离公共祖先一定更近)不断往上查找公共祖先即可。
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 } }
The text was updated successfully, but these errors were encountered:
先分别找到 p 和 q 的路径节点入栈,最后一次比较两个栈,最后一个相等的节点返回即可。 参考:https://www.bilibili.com/video/BV12Z4y15721?from=search&seid=8814694143711614664
var lowestCommonAncestor = function (root, p, q) { let pPath = []; let qPath = []; let stack = []; dfsSearch(root, p, stack, pPath); stack = []; dfsSearch(root, q, stack, qPath); let resNode = root; let i = 0; while (i < pPath.length && i < qPath.length) { if (pPath[i] === qPath[i]) { resNode = pPath[i]; } i++; } return resNode; }; var dfsSearch = function (node, target, stack, path) { if (node === null) return; stack.push(node); if (node === target) { // 这里注意不要直接 path = stack,这样会改变不到传入的 pPath,因为 path 指向了新的地址 for (const el of stack) { path.push(el); } return; } dfsSearch(node.left, target, stack, path); dfsSearch(node.right, target, stack, path); stack.pop(); }
Sorry, something went wrong.
No branches or pull requests
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
先通过 DFS 去找到 p 和 q 节点的深度,并且在查找的过程中对节点和他们的子节点之间建立父子关系。
之后,从深度最浅的那个节点开始(深度浅,离公共祖先一定更近)不断往上查找公共祖先即可。
The text was updated successfully, but these errors were encountered: