データ構造の復習: 13 日目

 

目次

1.二分探索木で検索

 1. 再帰

複雑さの分析

2. 反復

複雑さの分析

2.二分探索ブックへの挿入操作

 1. シミュレーション

アイデアとアルゴリズム

複雑さの分析

1.二分探索木で検索

700. 二分探索木での検索 - LeetCode https://leetcode.cn/problems/search-in-a-binary-search-tree/?plan=data-structions&plan_progress=ggfacv7

 1. 再帰

二分探索木は次の特性を満たします。

左側のサブツリーのすべてのノードの要素値はルートの要素値より小さく、
右側のサブツリーのすべてのノードの要素値はルートの要素値より大きくなります。
これに基づいて、次のアルゴリズムが得られます。

root が空の場合は空のノードを返し、
val=root.val の場合は \textit{root}root を返し、
val<root.val の場合は左のサブツリーを再帰し、
val>root.val の場合は右のサブツリーを再帰します。

class Solution {
public:
    TreeNode *searchBST(TreeNode *root, int val) {
        if (root == nullptr) {
            return nullptr;
        }
        if (val == root->val) {
            return root;
        }
        return searchBST(val < root->val ? root->left : root->right, val);
    }
};

複雑さの分析

時間計算量: O(N)、N は二分探索ツリー内のノードの数です。最悪の場合、二分探索木がチェーンであり、探している要素がチェーンの終端の要素より小さい (大きい) 場合、N 回再帰する必要があります。

空間の複雑さ: O(N)。再帰には、最悪の場合、O(N) スタック スペースが必要です。

2. 反復

方法 1 の再帰的方法を反復書き込みに変更します。

root が空の場合、ループから抜け出して空のノードを返します。val
=root.val の場合、root を返します。val
<root.val の場合、root を root.left に設定します。val
>root.val の場合、root を に設定します。ルート右。

class Solution {
public:
    TreeNode *searchBST(TreeNode *root, int val) {
        while (root) {
            if (val == root->val) {
                return root;
            }
            root = val < root->val ? root->left : root->right;
        }
        return nullptr;
    }
};

複雑さの分析

時間計算量: O(N)、NN は二分探索木のノード数です。最悪の場合、二分探索木がチェーンであり、探している要素がチェーンの終端の要素より小さい (大きい) 場合、N 回反復する必要があります。

空間複雑度: O(1)。余分なスペースは使用されません。

2.二分探索ブックへの挿入操作

701. 二分探索木での挿入操作 - LeetCode https://leetcode.cn/problems/insert-into-a-binary-search-tree/?plan=data-structions&plan_progress=ggfacv7

 1. シミュレーション

アイデアとアルゴリズム

まず、二分探索ツリーのプロパティを確認します。どのノード ルートでも、左側のサブツリー (存在する場合) のすべてのノードの値が root.val より小さく、右側のサブツリーのすべてのノードの値が小さくなります。 (存在する場合) root.val より大きく、それらはすべて二分探索木です。

したがって、root をルートとするサブツリーに val を挿入する場合、val と root.val の間のサイズ関係に基づいて、どのサブツリーに val を挿入するかを決定できます。

サブツリーが空でない場合、問題は \textit{val}val を対応するサブツリーに挿入することに変わります。
それ以外の場合は、ここで \textit{val}val を値として新しいノードを作成し、その親ノードのルートにリンクします。

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == nullptr) {
            return new TreeNode(val);
        }
        TreeNode* pos = root;
        while (pos != nullptr) {
            if (val < pos->val) {
                if (pos->left == nullptr) {
                    pos->left = new TreeNode(val);
                    break;
                } else {
                    pos = pos->left;
                }
            } else {
                if (pos->right == nullptr) {
                    pos->right = new TreeNode(val);
                    break;
                } else {
                    pos = pos->right;
                }
            }
        }
        return root;
    }
};

複雑さの分析

時間計算量: O(N)、N はツリー内のノードの数です。最悪の場合、ツリーの最も深いリーフ ノードに値を挿入する必要がありますが、最も深いリーフ ノードは O(N) です。

空間複雑度: O(1)。一定サイズのスペースのみを使用しました。

おすすめ

転載: blog.csdn.net/m0_63309778/article/details/126746985