题目:LCA(lowest common ancestor),给树和两节点,求这两节点的LCA。
递归:
1.拆分问题:在左右子树上找这两个点
2.返回值:分别在左右返回根,都没有返回NULL,有一个返回那个。
3.边界条件:访问到null 或访问到目标点,直接返回。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || root == p || root == q) return root;
TreeNode* l = lowestCommonAncestor(root->left, p, q);
TreeNode* r = lowestCommonAncestor(root->right, p, q);
if(l != nullptr && r != nullptr) return root;
return l == nullptr ? r : l;
}
Tarjan算法:
求多次询问时更快,递归每次询问都得O(n),即O(n*q),该算法可以O(n+q)
后续更。