思路
使用“类后序遍历”的做法可以使得时间复杂度为O(n),这里我们需要考虑这样一些情况,若以2进制位表示是否有我们需要的节点(000:中间为根,左右为孩子,0表示无,1表示有),即有:
- 101:根满足情况
- 110、011:根亦满足情况(易被忽略)
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *p, *q;
TreeNode * dfs(TreeNode *r) {
if (!r || r == p || r == q) return r; // 可能是000、010、110、011的情况
TreeNode *left = dfs(r->left);
TreeNode *right = dfs(r->right);
if (left && right) return r; // 此乃101的情况
else if (left) return left; // 此乃100的情况
else return right; // 此乃001的情况
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* _p, TreeNode* _q) {
p = _p;
q = _q;
return dfs(root);
}
};