C++实现二叉排序树

1.定义

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
简言之,左子树小于父节点,右子树大于父节点的二叉树就是二叉排序树
 

2.代码实现

递归插入:
判断当前结点是否是空指针,是则调用构造方法
当前结点不为空,和待插入参数obj进行比较,obj小于当前结点权值,递归插入左子树;obj大于当前结点权值,递归插入右子树
当前结点等于结点权值,不做处理
    template <typename T>
    void BinarySearchTree<T>::__insert(BinaryNode * & node, const T & obj)
    {
        if (node == nullptr) {
            node = new BinaryNode(obj, nullptr, nullptr);
        }
        else if (obj < node->element) {
            __insert(node->left, obj);
        }
        else if (obj > node->element) {
            __insert(node->right, obj);
        }
        else {
            //ignore case of duplicate
        }
    }

 迭代插入:

先判断当前结点是否为空,同上

设置flag标记,进入while循环,obj小于当前结点权值,左子树为空则为左子树实例化BinaryNode,否则左子树赋给当前结点,相当于当前结点往左下方移动

同理,obj大于当前结点权值,右子树为空则为右子树实例化BinaryNode,否则右子树赋给当前结点,相当于当前结点往右下方移动

当前结点等于结点权值,flag置为false,结束while循环

    template <typename T>
    void BinarySearchTree<T>::__insert(BinaryNode * & node, T && obj)
    {
        if (node == nullptr) {
            node = new BinaryNode(std::move(obj), nullptr, nullptr);
            return;
        }
        BinaryNode * currNode = node;
        bool flag = true;
        while (flag) {
            if (currNode->element > obj) {
                if (currNode->left == nullptr) {
                    currNode->left = new BinaryNode(std::move(obj), nullptr, nullptr);
                    flag = false;
                }
                else {
                    currNode = currNode->left;
                }
            }
            else if (currNode->element < obj) {
                if (currNode->right == nullptr) {
                    currNode->right = new BinaryNode(std::move(obj), nullptr, nullptr);
                    flag = false;
                }
                else {
                    currNode = currNode->right;
                }
            }
            else {
                flag = false;
                //case of duplicate
            }
        }
    }

 删除元素:

判断当前结点是否为空

obj小于当前结点权值,左子树递归调用__remove,直到当前结点为空,return结束;obj大于当前结点权值,右子树递归调用__remove,直到当前结点为空,return结束

当obj和当前结点权值相等时

判断左子树和右子树是否同时为空指针

未完待续。。。。。。

    template <typename T>
    void BinarySearchTree<T>::__remove(BinaryNode *node, const T & obj) {
        if (node == nullptr) {
            return;
        }

        if (obj < node->element) {
            __remove(node->left, obj);
        }
        else if (obj > node->element) {
            __remove(node->right, obj);
        }
        else {
            if (node->left != nullptr &&
                node->right != nullptr) {
                node->element = __findMin(node->right)->element;
                __remove(node->right, node->element);
            }
            else {
                BinaryNode *oldNode = node;
                node = (node->left != nullptr) ? node->left : node->right;
                delete oldNode;
            }

        }
    }

 代码:https://github.com/cjy513203427/C_Program_Base/tree/master/60.%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91

猜你喜欢

转载自www.cnblogs.com/Java-Starter/p/10150717.html