二叉查找树
对于任意一棵子树,其左子树比根节点小,右子树比根节点大。即:左 < 根 < 右
查找
比较目标值与根节点的大小关系,
- 大就往右边找;
- 小就往左边找;
- 直到找到为止,如果到最后没有找到,则返回
nullptr
Node * BST::searchByIter(Node * bst, DataType target) {while (bst != nullptr) {//目标值比当前值大,往右走if (target > bst->data) {bst = bst->right;}//目标值比当前值小,往左走else if (target < bst->data) {bst = bst->left;}//不大不小,刚刚好else {return bst;}}//如果元素在树中,在前面循环执行的过程中就会返回,如果程序走到这里,就说明树中不存在该目标元素,返回空return nullptr;
}
获取最值
二叉查找树的特性是“左小右大”,所以找最大值直接向树的最右端找,找最小值直接去树的最左端找。
获取最大值:
DataType BST::getMax(Node * root) {//寻找树最左端的值,即最小值while (root->right != nullptr) {root = root->right;}return root->data;
}
获取最小值:
DataType BST::getMin(Node * root) {while (root->left != nullptr) {root = root->left;}return root->data;
}
插入节点
- 若节点为空:分配一个节点
- 非空,比较大小,往对应的方向递归,直至为空;
void BST::insert(Node *& root, DataType target) {//为空,分配一个空间if (root == nullptr) {root = new Node();root->data = target;root->left = root->right = nullptr;}//比当前节点值小,向左找节点插入else if (target < root->data) {root->left = insert(root->left, target);}//比当前节点值大,向右找节点插入else if (target > root->data) {root->right = insert(root->right, target);}//else target存在,什么都不做return root;
}
删除节点
- 节点为空:不可操作
- 节点存在:
- 要删除的节点是叶子节点:直接删除
- 要删除的节点只有一个子节点:用该节点的子节点代替当前节点
- 要删除的节点有两个子节点:找左子树中最大的节点或者右子树中最小的节点来代替当前要删除的节点
Node * BST::delete(Node *& root, DataType target) {if (root == nullptr) {cout << "Node is not exist!\n";}//大了else if (target > root->data) {}//小了else if (target < root->data) {}//找到了else {//左右子树都存在if (root->left != nullptr && root->right != nullptr) {}//当前节点是叶子节点else if (root->left == nullptr && root->right == nullptr) {}else if (root->left == nu)}return root;
}