【难】【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
原创粉丝点击