バイナリ検索ツリー(バイナリ検索ツリー)、(また:バイナリ検索ツリー、バイナリ・ソートツリー)のいずれか、次のプロパティを持つ空の木やバイナリツリーである:
1.場合にそれの左部分木が空ではありません、左の部分木の値は、すべてのノードが少ないルートの値以上である;
2.その右サブツリーが空でない場合、右の部分木のノードは、そのルートの値より大きいすべての値であります;
3.その左右のサブツリーは、バイナリ・ソートツリーです。
struct BST_Node
{
int val;
BST_Node *left;
BST_Node *right;
BST_Node(int x) : val(x), left(nullptr), right(nullptr){}
};
バイナリ検索ツリーを操作すると、 `
1.バイナリ検索ツリーを検索し
、ルートノードが空でない場合:
キールートキーが== trueを返し見つけた場合は
、ルートキー>はその左部分木にキールックスを探す場合は
、ルートキーの場合<その右のサブツリーでキールックスを探す
そうでない場合はfalse
BST_Node* searchBST(BST_Node *root, int val)
{
while (root != nullptr)
{
if (root->val < val)
{
root = root->right;
}
else if (root->val > val)
{
root = root->left;
}
else
{
break;
}
}
return root;
}
2.バイナリ検索ツリー挿入
ツリーが空の場合、その後、直接復帰への真の
木が空でない場合、挿入位置を見つけるために、二分探索木の性質に応じて、新しいノードを挿入
BST_Node* insertBST(BST_Node *root, int val) {
if (root == nullptr)
{
root = new BST_Node(val);
return root;
}
if (root->val < val)
{
return insertBST(root->right, val);
}
else if (root->val > val)
{
return insertBST(root->left, val);
}
return nullptr;
}
3.削除バイナリ検索ツリーは、
最初の要素は二分探索木であり、そうでない場合、戻り値、または以下の4つのケースを分割することができる、削除ノードになります。
- 子ノードのないノードを削除するには
- 唯一の左の子ノードのノードを削除するには
- 唯一の右の子ノードのノードを削除するには
- ノードが残っていると右の子ノードが削除する
ノードを削除しているように見えることはケース1の実際の状況は、2または3と組み合わせることができ、4例があるため、次のように実際の除去プロセスは次のとおりです。
ケース2:ノードを削除し、左の子ノードがノード削除されているノードの親ノードポイントを削除する
場合3:ノードを削除し、その削除されたノードの親ノードポイントは、ノードおよび右の子を削除すると、ノード
シナリオ4:これで右の子、シーケンスの最初のツリーノード(最小キー)を探し、その値を削除したノードを埋めるために、再び処理することは、ノード削除を発行します
void deleteBST_Node(BST_Node *root, int val)
{
if (root == nullptr)
{
return ;
}
BST_Node *parent = nullptr, *cur = root;
while (cur != nullptr)
{
if (cur->val < val)
{
parent = cur;
cur = cur->right;
}
else if (cur->val > val)
{
parent = cur;
cur = cur->left;
}
else { //找到待删除结点
BST_Node *del = cur;
if (cur->left == nullptr && cur->right == nullptr) //左右子树都为空
{
if (parent->left == cur)
parent->left = nullptr;
else if (parent->right == cur)
parent->right = nullptr
delete cur;
}
else if (cur->left != nullptr && cur->right != nullptr) //左右子树都不为空
{
del = cur->right;
while (del->left != nullptr)
{
parent = del;
del = del->left;
}
cur->val = del->val;
if (del == cur->right)
{
parent->right = del->right;
}
else
{
parent->left = del->right;
}
delete del;
}
else //左右子树其中一个为空
{
if (cur->left != nullptr)
{
if (parent->left == cur)
{
parent->left = cur->left;
}
else
{
parent->right = cur->left;
}
}
else
{
if (parent->left == cur)
{
parent->left = cur->right;
}
else
{
parent->right = cur->right;
}
}
delete cur;
}
break;
}
}
}