1.トピック
2.アイデア
2つのノードの最も近い共通の祖先を見つける問題を実行しましたが、この問題は二分探索木BSTであり、この問題のすべてのノードの値が異なるため、の数値特性に従って判断できます。 BST、つまり、左側のサブツリー右側のサブツリーのすべてのノードは現在のノードよりも小さく、右側のサブツリーのすべてのノードは現在のノードよりも数値的に大きくなっています。
ルートがp、qの最新の共通祖先である場合、次のいずれか1つのみが可能です。
- pとqはルートのサブツリーにあり、ルートの反対側に配置されます(つまり、それぞれ左と右のサブツリーに配置されます)。
- p =ルート、qはルートの左または右のサブツリーにあります。
- q =ルート、pはルートの左または右のサブツリーにあります。
方法1:反復法
- ループ検索:ノードルートが空のときにジャンプします。
- p、qがルートの右側のサブツリーにある場合、root.rightにトラバースします。
- それ以外の場合、p、qがルートの左側のサブツリーにある場合は、root.leftまでトラバースします。
- それ以外の場合は、最も近い共通の祖先が見つかったことを示し、飛び出します。
- 戻り値:最も近い共通の祖先ルート。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
if(root->val < p->val && root->val < q->val){
root = root->right;
}else if(root->val > p->val && root->val > q->val){
root = root->left;
}else{
break;
}
}
return root;
}
};
- 時間計算量:O(N)、ここでNはバイナリツリー内のノードの数であり、トレーニングラウンド中に1つのレイヤーが「処理」されます。BSTツリーの最小の高さはlogNで、最大の高さはN(縮退)です。リンクリストに)。
- スペースの複雑さ:O(1)、一定サイズの余分なスペースを使用。
方法2:再帰
実際、反復法でwhileループを削除するか、3つのケースがありますが、最初の2つのケースでは再帰的です。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p->val > root->val && q->val > root->val){
return lowestCommonAncestor(root->right, p, q);
}else if(p->val < root->val && q->val < root->val){
return lowestCommonAncestor(root->left, p, q);
}
return root;
}
};