【难】【BET】无重复值的搜索二叉树的插入和删除操作
来源:互联网 发布:蜗牛移动 网络 编辑:程序博客网 时间:2024/06/05 02:40
题目:EPI
class treenode{public:int data;shared_ptr<treenode> left, right;treenode(int d) :data(d), left(nullptr), right(nullptr){}treenode(int d, shared_ptr<treenode> &l, shared_ptr<treenode> &r) :data(d), left(l), right(r){}};bool BST_insert(shared_ptr<treenode> &root, const int key){shared_ptr<treenode> t(new treenode(key));if (root == nullptr){root = t;return true;}shared_ptr<treenode> cur = root, parent = nullptr;while (cur && cur->data != key){parent = cur;if (cur->data > key)cur = cur->left;elsecur = cur->right;}//不插入重复的值if (cur && cur->data == key){t = nullptr;return false;}//插入操作if (key < parent->data)parent->left = t;elseparent->right = t;return true;}bool BST_earse(shared_ptr<treenode> &root, const int key){shared_ptr<treenode> cur = root, parent = nullptr;//寻找值为key的节点while (cur && cur->data!=key){parent = cur;if (cur->data > key)cur = cur->left;elsecur = cur->right;}//找不到值为key的节点if (cur == nullptr)return false;//此时 cur->data==key,应该删除cur节点//若cur有右孩子,则cur的父节点parent应连接cur右子树的最小节点cur_r_min//cur的孩子变成cur_r_min的孩子if (cur->right){//cur_r_par初始化为cur,对cur的右孩子就是右子树最小值的情况,起着关键作用!shared_ptr<treenode> cur_r = cur->right, cur_r_par=cur;while (cur_r->left){cur_r_par = cur_r;cur_r = cur_r->left;}//若被删节点是root,则此时 parent==nullptr//此时cur_r是最小值了,parent连接cur_rif (parent && parent->left == cur)parent->left = cur_r;else if (parent)parent->right = cur_r;//cur_r_par要连接cur_r的右子树if (cur_r_par->left==cur_r)cur_r_par->left = cur_r->right;elsecur_r_par->right = cur_r->right;//cur_r“接管”被删除节点cur的左右孩子cur_r->left = cur->left;cur_r->right = cur->right;if (root == cur)root = cur_r;}else//若cur没有右孩子{if (root == cur)root = cur->left;if (parent && parent->left == cur)parent->left = cur->left;else if (parent)parent->right = cur->left;}cur = nullptr;return true;}//测试代码void inorder(const shared_ptr<treenode> &root){if (root == nullptr)return;inorder(root->left);cout << root->data << "\t";inorder(root->right);}shared_ptr<treenode> a1(new treenode(1));shared_ptr<treenode> a2(new treenode(2));shared_ptr<treenode> a3(new treenode(3));shared_ptr<treenode> a4(new treenode(4));shared_ptr<treenode> a5(new treenode(5));shared_ptr<treenode> a6(new treenode(6));shared_ptr<treenode> a7(new treenode(7));shared_ptr<treenode> a8(new treenode(8));a4->left = a2;a4->right = a6;a2->left = a1;a2->right = a3;a6->left = a5;a6->right = a7;a7->right = a8;inorder(a4);cout << endl;BST_earse(a4, 7);inorder(a4);cout << endl;
0 0
- 【难】【BET】无重复值的搜索二叉树的插入和删除操作
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉树的搜索和插入操作
- 二叉搜索树的搜索、插入、遍历和删除(Java)
- 二叉搜索树的插入、搜索和删除
- 二叉搜索树的插入,搜索,删除
- 二叉搜索树的插入,删除,查找操作
- 二叉搜索树的查找、插入、删除操作
- 二叉搜索树的插入与删除操作
- 二叉搜索树的插入,删除,遍历操作详解
- 二叉搜索树的插入、查找、删除等操作
- 二叉搜索树的插入和删除结点操作以及iterator的构造
- 【算法导论】二叉搜索树的插入和删除
- 自定义组件<五>
- git merge commitId 把其他分支的某次提交merge进该分支
- Unrecognized Windows Sockets error 0 JVM_Bind异常解决办法
- 备查ant配置发送邮件
- IIS7.5+Mysql5.6.22+PHP5.6.4安装配置
- 【难】【BET】无重复值的搜索二叉树的插入和删除操作
- unexpected T_ENDFOREACH PHP FOREACH循环 syntax error, unexpected T_ENDFOREACH错误
- Linux查看CPU和内存使用情况
- Lucence创建索引实例
- 获取路径文件名称
- Rails 支持 Response 数据 GZip 压缩 json
- Delphi 在DLL中使用DevExpress控件时出错解决办法
- SQLite中的SQL
- POJ 2653 Pick-up sticks