目次
1.二分探索木で検索
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.二分探索ブックへの挿入操作
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)。一定サイズのスペースのみを使用しました。