[LeetCode swordはオファーを指します]バイナリ検索ツリーの最も近い共通の祖先(反復または再帰)

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

おすすめ

転載: blog.csdn.net/qq_35812205/article/details/123968710