题目地址:
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-iii/
给定一棵二叉树,给定其中的两个节点 p p p和 q q q,求它们的最近公共祖先。题目中树的节点是有指向其父节点的指针的。
先求一下两个节点离树根的距离,然后让距离远的那个向上走若干步使得两个节点离树根距离相等,接着两个节点都向上齐头并进,直到相遇,相遇点就是LCA。代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* parent;
};
*/
class Solution {
public:
Node* lowestCommonAncestor(Node* p, Node* q) {
auto pp = p, qq = q;
int dp = 0, dq = 0;
while (pp) dp++, pp = pp->parent;
while (qq) dq++, qq = qq->parent;
if (dp < dq) swap(p, q);
for (int i = 0; i < abs(dp - dq); i++) p = p->parent;
while (p != q) p = p->parent, q = q->parent;
return p;
}
};
时间复杂度 O ( h ) O(h) O(h),空间 O ( 1 ) O(1) O(1)。