题目:二叉树的最近公共祖先

思路:

因为需要从下往上进行遍历,所以采用的是后序遍历(左右中),这样就可以让中间节点拿到左右子树的信息,从而判断自身是否为公共祖先——如果子树没有搜索到目标节点,会返回空指针;只有当左右子树的返回值都不为空时,才可以判断当前节点为公共祖先

具体实现:

首先定义递归结束的条件——当前节点为空,或当前节点就是需要进行查找的节点

之后就开始对左右子树进行递归遍历,当目标节点存在于左右子树中时,就直接返回当前节点(理由如上);当只有左子树找到目标节点而右子树没有搜索到时,就返回左节点(因为此时两个目标值都位于左子树中);只有右子树搜索到时同理

 1TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q)
 2{
 3    if(!root) return nullptr;
 4    if(root == p || root == q) return root;
 5
 6    TreeNode* left = traversal(root->left, p, q);
 7    TreeNode* right = traversal(root->right, p, q);
 8
 9    if(left && right) return root;
10    else if(left && !right) return left;
11    else if(!left && right) return right;
12    else return nullptr;
13}
14
15TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
16{
17    return traversal(root, p, q);
18}