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; } } }