LeetCode每日一題5月10日 LeetCode236.二叉樹的最近公共祖先

問題描述:

給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義爲:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示爲一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree
例如,給定如下二叉樹:  root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。

 示例 2:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因爲根據定義最近公共祖先節點可以爲節點本身。

說明:

所有節點的值都是唯一的。
p、q 爲不同節點且均存在於給定的二叉樹中

解題思路: 

        注意p,q必然存在樹內, 且所有節點的值唯一!!!
        遞歸思想, 對以root爲根的(子)樹進行查找p和q, 如果root == null 返回null

        p==root || q==root 直接返回root
        表示對於當前樹的查找已經完畢, 否則對左右子樹進行查找, 根據左右子樹的返回值判斷:
        1. 左右子樹的返回值都不爲null, 由於值唯一左右子樹的返回值就是p和q, 此時root爲LCA
        2. 如果左右子樹返回值只有一個不爲null, 說明只有p和q存在與左或右子樹中, 最先找到的那個節點爲LCA
        3. 左右子樹返回值均爲null, p和q均不在樹中, 返回null

 

/**
 * 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(p==root || q==root) return root;
        TreeNode *left = lowestCommonAncestor(root->left,p,q);
        TreeNode *right = lowestCommonAncestor(root->right,p,q);
        if(left == NULL && right == NULL) return NULL;
        else if(left != NULL && right != NULL) return root;
        else return left == NULL ? right : left;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章