二叉查找树
二叉查找树
对于任意一棵子树,其左子树比根节点小,右子树比根节点大。即:左 < 根 < 右
查找
比较目标值与根节点的大小关系,
- 大就往右边找;
- 小就往左边找;
- 直到找到为止,如果到最后没有找到,则返回
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架