/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* parent;
};
*/
class Solution {
public:
Node* lowestCommonAncestor(Node* p, Node * q) {
}
};
1650. 二叉树的最近公共祖先 III
给定一棵二叉树中的两个节点 p
和 q
,返回它们的最近公共祖先节点(LCA)。
每个节点都包含其父节点的引用(指针)。Node
的定义如下:
class Node { public int val; public Node left; public Node right; public Node parent; }
根据维基百科中对最近公共祖先节点的定义:“两个节点 p 和 q 在二叉树 T 中的最近公共祖先节点是后代节点中既包括 p 又包括 q 的最深节点(我们允许一个节点为自身的一个后代节点)”。一个节点 x 的后代节点是节点 x 到某一叶节点间的路径中的节点 y。
示例 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,根据定义,一个节点可以是自身的最近公共祖先。
示例 3:
输入: root = [1,2], p = 1, q = 2 输出: 1
提示:
[2, 105]
。-109 <= Node.val <= 109
Node.val
都是互不相同的。p != q
p
和 q
存在于树中。原站题解
golang 解法, 执行用时: 4 ms, 内存消耗: 6.2 MB, 提交时间: 2023-10-16 21:45:51
/** * Definition for Node. * type Node struct { * Val int * Left *Node * Right *Node * Parent *Node * } */ func lowestCommonAncestor(p *Node, q *Node) *Node { var dfs func(*Node,*Node) bool dfs =func(pn *Node,qn *Node) bool{ if pn==nil{ return false } if pn.Val==qn.Val{ return true } return dfs(pn.Left,qn) || dfs(pn.Right,qn) } for p!=nil{ if dfs(p,q){ return p } p =p.Parent } return nil }
python3 解法, 执行用时: 60 ms, 内存消耗: 20.5 MB, 提交时间: 2023-10-16 21:44:55
""" # Definition for a Node. class Node: def __init__(self, val): self.val = val self.left = None self.right = None self.parent = None """ class Solution: def lowestCommonAncestor(self, p: 'Node', q: 'Node') -> 'Node': seen = set() queue = collections.deque([p, q]) while queue: curr = queue.popleft() if curr in seen: return curr seen.add(curr) if curr.parent: queue.append(curr.parent)
java 解法, 执行用时: 28 ms, 内存消耗: 43.4 MB, 提交时间: 2023-10-16 21:44:37
/* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node parent; }; */ class Solution { public Node lowestCommonAncestor(Node p, Node q) { Set<Node> seen = new HashSet<>(); while (p != null) { seen.add(p); p = p.parent; } while (q != null) { if (seen.contains(q)) { return q; } q = q.parent; } return null; } } class Solution2 { public Node lowestCommonAncestor(Node p, Node q) { Node curP = p; Node curQ = q; while (curP != curQ) { curP = (curP == null) ? q : curP.parent; curQ = (curQ == null) ? p : curQ.parent; } return curP; } }
cpp 解法, 执行用时: 16 ms, 内存消耗: 10.4 MB, 提交时间: 2023-10-16 21:44:11
/* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* parent; }; */ class Solution { public: Node* lowestCommonAncestor(Node* p, Node * q) { Node* point_p = p; Node* point_q = q; while (point_p != point_q) { point_p = point_p->parent ? point_p->parent : q; point_q = point_q->parent ? point_q->parent : p; } return point_p; } };