题目链接:LeetCode236
思路:由于是单次的查询,且是二叉链表的存储方式,所以这里采用
O
(
n
)
O(n)
O(n)的遍历方式维护单词询问,核心逻辑是基于后序遍历的
d
f
s
dfs
dfs。
- 逻辑如下:
当root是p、q其中之一时显然root就是LCA(T, p, q);
当root非q且非p时要往左右两边搜索,如果恰好一边一个,那么root是LCA(T, p, q);否则返回搜到非空结点的那一边。
算法复杂度 O ( n ) O(n) O(n)
/**
* 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) {
if (root == NULL) return NULL;
if (root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left && right) return root; //一左一右
return left ? left : right;
}
};