LeetCodeブラシタイトル:最近の共通の祖先二分探索木(day38)
件名の説明:
二分探索木を考えると、ツリーの指定された2つのノードの最も近い共通の祖先を見つけます。
Baiduの百科事典定義されるような最近の共通の祖先「ツリーT pのルートの二つのノードについては、qは、共通の祖先ノードXとして表され、そのXはP、Qの祖先の深さが可能であり、xと同じ大きさであります(ノードは、それ自身の祖先であることができます)。 "
ルート= [6,2,8,0,4,7,9、NULL、NULL、3,5]たとえば、次のバイナリ検索ツリーを与え
例1:
入力:ルート= [6,2,8,0,4,7,9、NULL、 NULL、3,5]、P = 2、Q = 8
出力:6
説明:ノード2,8が共通の祖先であります6。
例2:
入力:ルート= [6,2,8,0,4,7,9、NULL、 NULL、3,5]、P = 2、Q = 4
出力:2
説明:ノード2及び4は共通の祖先2、定義によって最近の共通の祖先ノードはノード自体できるため。
説明:
すべてのノードの値がユニークです。
P、Q、および異なるノードに対する所定のバイナリ検索ツリー内に存在します。
アイデア:二分探索木の特性を利用して
コードの場合:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//利用二叉搜索树的特性
TreeNode res = null;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
lca(root, p , q);
return res;
}
public void lca(TreeNode root, TreeNode p , TreeNode q){
if((root.val - p.val)*(root.val - q.val) <= 0){
res = root;
}else if(root.val < p.val && root.val < q.val){
lca(root.right, p , q);
}else{
lca(root.left, p , q);
}
}
}
結果:
時間のかかります: