LeetCodeブラシタイトル:最近の共通の祖先二分探索木(day38)

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);
        }
    }
}

結果:

時間のかかります:

おすすめ

転載: blog.csdn.net/weixin_44083005/article/details/92082739