バイナリツリーを指定して、ツリー内の指定された2つのノードの最下位共通祖先(LCA)を見つけます。
ウィキペディアのLCAの定義によると、「2つのノードpとqの間に、pとqの両方を子孫として持つTの最下位ノードとして定義されます(でき
次のバイナリツリーがあるとします。root= [3,5,1,6,2,0,8、null、null、7,4]
例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