236.二分木の最下位の共通祖先

タイトルの説明

バイナリツリーを指定して、ツリー内の指定された2つのノードの最下位共通祖先(LCA)を見つけます。

ウィキペディアのLCA定義によると、「2つのノードpとqの間に、pとqの両方を子孫として持つTの最下位ノードとして定義されます(ノードを自分の子孫にすることができます)。 」

次のバイナリツリーがあるとします。root= [3,5,1,6,2,0,8、null、null、7,4]

img

例1:

入力:ルート= [3,5,1,6,2,0,8、null、null、7,4]、p = 5、q = 1 
出力:3
説明:ノード5と1のLCAは3です。

例2:

入力:ルート= [3,5,1,6,2,0,8、null、null、7,4]、p = 5、q = 4 
出力:5
説明:ノード5および4のLCAは5ですLCAの定義によれば、ノードはそれ自体の子孫になる可能性があるためです。

 

注意:

  • ノードの値はすべて一意になります。

  • pとqは異なり、両方の値がバイナリツリーに存在します。

難易度

ソリューション1:シンプルなDFS

クラスSolution {
 public 
    TreeNode * leastCommonAncestor(TreeNode * root、TreeNode * p、TreeNode * q){
         if(!root || root == p || root == q)return root;
        // 得られた是子节点 
        TreeNode * left = leastCommonAncestor(root-> left、p、q); 
        TreeNode * right = leastCommonAncestor(root-> right、p、q);
        // 戻り父节点
        if(左&&右)return root; 
        
        左に戻りますか?左右;       
    } 
};

 

解決策2:最後のアルゴリズムを最適化する

クラスSolution {
 public 
    TreeNode * leastCommonAncestor(TreeNode * root、TreeNode * p、TreeNode * q){
        if(!root || p == root || q == root)return root; 
       TreeNode * left = leastCommonAncestor(root-> left、p、q);
       // すでにわかっていることを示し、再検索する
       必要がない場合(left && left!= p && left!= q)return left; 
       TreeNode * right = leastCommonAncestor(root-> right、p、q);
    if(左&&右)ルートを返す;
       左に戻りますか?左右; 
    } 
};

githubアドレス:https : //github.com/AntonioSu/leetcode/blob/master/problems/236.LowestCommonAncestorofaBinaryTree.md

おすすめ

転載: www.cnblogs.com/AntonioSu/p/12757807.html