题目地址:
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-ii/
给定一棵二叉树,再给定两个节点(未必在树中),求这两个节点的最近公共祖先。如果某个节点不在则返回null。
思路是DFS。如果两个节点都在树中,则可以参考https://blog.youkuaiyun.com/qq_46105170/article/details/104141292的做法。而这道题中不能保证两个节点都在树中,所以DFS的时候,如果遇到root等于 p p p或 q q q的时候,是不能立刻返回root的,因为不能判断另一个节点是否在树中。所以我们的方案是采取后序遍历,保证每个节点都被遍历到。然后的逻辑就和两个节点都在树中一样了。并且,当搜索到 p p p或 q q q的时候,我们做个标记,记录是否两个节点都找到了,就可以返回答案了。代码如下:
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
int mark = 0;
auto res = dfs(root, p, q, mark);
if (mark != 3) return nullptr;
return res;
}
TreeNode* dfs(auto root, auto p, auto q, int& mark) {
if (!root) return nullptr;
auto l = dfs(root->left, p, q, mark), r = dfs(root->right, p, q, mark);
if (root == p) {
mark |= 1;
return root;
}
if (root == q) {
mark |= 2;
return root;
}
if (l && r) return root;
return l ? l : r;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。