剑指 Offer 68 - II. 二叉树的最近公共祖先(后序遍历 DFS)

2021年02月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】


1. 问题简介

剑指 Offer 68 - II. 二叉树的最近公共祖先
在这里插入图片描述

2. 后序遍历 DFS

二叉树的后序遍历,分情况进行讨论,具体看注释,解释的比较清楚。

/**
 * 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) {
    
    
        // 终止条件:如果p和q中有等于root的,那么它们的最近公共祖先即为root(一个节点也可以是它自己的祖先)
        if(root==nullptr || root==p || root==q) return root;
        // 如果left不为空,说明左边有p或q
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        // 如果right不为空,说明右边有p或q
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        // 如果left为空,说明左边没有p或q,p和q都在右边,返回右边的结果
        if(left==nullptr) return right;
        // 如果right为空,说明右边没有p或q,p和q都在右边,返回右边的结果
        else if(right==nullptr) return left;  
        // 如果left和right都不为空,说明两边各有一个,最近公共祖先是root(对应情况1)
        return root;
    }
};

参考文献

《剑指offer 第二版》

https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-er-cha-shu-de-zui-jin-gong-gon-7/

猜你喜欢

转载自blog.csdn.net/m0_37433111/article/details/113790678