1. 程式人生 > 其它 >Leetcode---236. 二叉樹的最近公共祖先

Leetcode---236. 二叉樹的最近公共祖先

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

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

示例 1:

在這裡插入圖片描述

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

思路:遞迴的思想,遞迴的結束條件是root == p || root == q
具體做法:

  1. pq 有三種情況。
    (1)pq 分佈在兩個子樹
    (2)pq在一個子樹
    (3)pq都不存在(這種情況不需要考慮,題目描述中pq是肯定存在的)
    第一種情況進行分析:
    針對這種情況,遞迴的作用就是尋找pq,利用root->left和root->right 是否等於p或q 作為遞迴停止條件,找到了就返回root給left和right。
    第二種情況:
    這種情況下,pq都在一個子樹內,若pq的深度不同,如上圖找5和4 的公共祖先,p和q中有一個必被先找到。此時left和right一個有值,一個為空。則非空的為公共祖先。若pq深度相同,則原理同情況1.
class Solution {
public:
    TreeNode* lowestCommonAncestor
(TreeNode* root, TreeNode* p, TreeNode* q) { //遞迴停止條件 if(root == nullptr) return root; if(root == p || root == q) return root; //遞迴進行查詢 TreeNode* left = lowestCommonAncestor(root->left,p,q); TreeNode* right = lowestCommonAncestor(root->right,
p,q); //找到pq後進行結果判定 if(left && right) return root; return left? left:right; } };