題目地址
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
題目要求
給定一個(gè)二叉樹, 找到該樹中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先屹耐。
百度百科中最近公共祖先的定義為:“對(duì)于有根樹 T 的兩個(gè)結(jié)點(diǎn) p钧唐、q,最近公共祖先表示為一個(gè)結(jié)點(diǎn) x踊餐,滿足 x 是 p军浆、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)夫植〔匆担”
例如且叁,給定如下二叉樹: 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
解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 1 的最近公共祖先是節(jié)點(diǎn) 3都哭。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 4 的最近公共祖先是節(jié)點(diǎn) 5。因?yàn)楦鶕?jù)定義最近公共祖先節(jié)點(diǎn)可以為節(jié)點(diǎn)本身逞带。
說明:
- 所有節(jié)點(diǎn)的值都是唯一的欺矫。
- p、q 為不同節(jié)點(diǎn)且均存在于給定的二叉樹中展氓。
解題思路
LCA問題穆趴。
使用遞歸的思想,對(duì)二叉樹進(jìn)行后序遍歷遇汞。
(1)當(dāng)左右子樹返回值均為null未妹,說明p、q均不在子樹中空入,返回null络它。
(2)當(dāng)左右子樹中有一個(gè)樹返回了值,說明p歪赢、q有一個(gè)在子樹中化戳,返回該值。
(3)當(dāng)左右子樹均有返回值轨淌,說明該節(jié)點(diǎn)是最近的公共祖先迂烁,返回節(jié)點(diǎn)值。
需要注意的
- 當(dāng)一個(gè)節(jié)點(diǎn)
r
為p
和q
的最近公共祖先時(shí)递鹉,p
和q
分別在r的左右兩側(cè)盟步。 - 一個(gè)節(jié)點(diǎn)可以是自己的祖先。
- 因?yàn)椴皇嵌嫠阉鳂洌˙ST)躏结,所以直接用后序遍歷的方法却盘。
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||root==p||root==q){
return root;
}
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
//左樹是空值,返回右節(jié)點(diǎn);右數(shù)是空值黄橘,返回左節(jié)點(diǎn)兆览,否則返回根節(jié)點(diǎn)。
return left == null ? right : right == null ? left : root;
}
}