题目链接: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;
}
};
LeetCode236题解

本文详细解析了LeetCode236题目的解决方案,采用O(n)的遍历方式,通过后序遍历的深度优先搜索算法寻找二叉树中两个节点的最近公共祖先。当根节点为p或q之一时,直接返回该节点;否则,递归地在左右子树中查找p和q,若在一左一右则当前根节点即为LCA。
1260

被折叠的 条评论
为什么被折叠?



