バイナリ検索ツリーの挿入や削除を探します

バイナリ検索ツリー(バイナリ検索ツリー)、(また:バイナリ検索ツリー、バイナリ・ソートツリー)のいずれか、次のプロパティを持つ空の木やバイナリツリーである:
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. ノードが残っていると右の子ノードが削除する
    ノードを削除しているように見えることはケース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;
        }
    }
}
公開された10元の記事 ウォン称賛16 ビュー325

おすすめ

転載: blog.csdn.net/qq_45386840/article/details/104894071