- <李>
李> <李>
李>
# pragma 一次 # includeusing namespace 性传播疾病; template struct AVLTreeNode { AVLTreeNode *, _left; AVLTreeNode *, _right; AVLTreeNode *, _parent; K _key; V _value; int _bf; AVLTreeNode (const K&,钥匙,,const V&,值) :_left(空) ,_right(空) ,_parent(空) ,_key(关键) ,_value(值) ,_bf (0) {} }; template class AVLTree { typedef AVLTreeNode ,节点; 公众: AVLTree () :_root(空) {} ~ AVLTree () {} bool 插入(const K&,,, const V&,值) { if (_root ==, NULL) { 时间=_root new 节点(键,值); return 真实; } 节点*,cur =, _root; 节点*,parent =,空; while (坏蛋) { if (cur→_key & lt;,键) { parent =,坏蛋; 时间=cur cur→_right; } else if (cur→_key>键) { parent =,坏蛋; 时间=cur cur→_left; } 其他的 { cout & lt; & lt;,“该节点已经存在”,& lt; & lt;, endl; return 假; } } 时间=cur new 节点(键,值); if (父→_key & lt;,键) { 父母→_right =,坏蛋; 时间=cur→_parent 家长; } 其他的 { 父母→_left =,坏蛋; 时间=cur→_parent 家长; }//更新平衡因子 while (父) { if (cur ==,父→_right) + +父母→_bf; else if (cur ==,父→_left) ——父母→_bf; if (父→_bf ==, 0) 打破; else if (父→_bf ==, 1, | |,父→_bf ==, 1) { 时间=cur 家长; 时间=parent cur→_parent; } else //平衡因子为2或2时的情况 { if (父→_bf ==, 2) { if (cur→_bf ==, 1) {,,//左旋转 RotateL(父); } else if (cur→_bf==1) { RotateRL(父); } } 其他的 { if (cur→_bf ==, 1) {//右旋转 旋转(父); } else if (cur→_bf ==, 1) { RotateLR(父); } } 打破; } } return 真实; } 节点*,找到(const K&,键) { if (_root ==, NULL) return 零; 节点*,cur =, _root; while (坏蛋) { if (cur→_key & lt;,键) { 时间=cur cur→_right; } else if (cur→_key>键) { 时间=cur cur→_left; } 其他的 { cout & lt; & lt;,“找到该数”,& lt; & lt;, endl; return ,坏蛋; } } return 零; } bool 删除(const K&,键) { if (_root ==, NULL) return 假; 节点*,cur =, _root; 节点*,parent =,空; while (坏蛋) { if (cur→_key & lt;,键) { parent =,坏蛋; 时间=cur cur→_right; } else if (cur→_key>键) { parent =,坏蛋; 时间=cur cur→_left; } 其他的 { if (cur→_left ==, NULL ,,,坏蛋→_right ==, NULL) {//1。左右都为空 if (parent ==, NULL) 时间=_root 零;//若只有一个节点 其他的 { if (父→_left ==, cur) 父母→_bf + +; 其他的 父母→_bf——; } delete ,坏蛋; 时间=cur 零; } else if (cur→_left&,坏蛋→_right) {//2。左右都不为空 节点*,RightMin =,坏蛋→_right; while (RightMin→_left) { 时间=parent RightMin; 时间=RightMin RightMin→_left; } 坏蛋→_key =, RightMin→_key;//采用替换法删除 坏蛋→_value =, RightMin→_value; if (父→_left ==, RightMin) { 父母→_bf + +; 时间=父→_left RightMin→_right; } 其他的 { 父母→_bf——; 时间=父→_right RightMin→_right; } delete RightMin; 时间=RightMin 零; } 其他的 {//3。左为空或右为空 if (cur→_left) {//1)。右为空 if (parent ==, NULL) {//只有两个节点,且为左孩子 时间=_root cur→_left; 时间=_root→_bf 0; } 其他的 { if (父→_left ==, cur) { 父母→_left =,坏蛋→_left; 父母→_bf + +; } 其他的 { 父母→_right =,坏蛋→_left; 父母→_bf——; } } } 其他的 {//2).cur的左为空 if (parent ==, NULL) {//只有两个节点,且为左孩子 时间=_root cur→_right; 时间=_root→_bf 0; } 其他的 { if (父→_left ==, cur) { 父母→_left =,坏蛋→_right; 父母→_bf + +; } 其他的 { 父母→_right =,坏蛋→_right; 父母→_bf——; } } } delete ,坏蛋; 时间=cur 零; } 打破; } } while (父) {//平衡因子为0或1,1对这个树的高度不会产生影响 if (父→_parent→_left ==,父母) 父母→_parent→_bf + +; 其他的 父母→_parent→_bf——; if (父→_parent→_bf ==, 0) return 真实; else if (父→_parent→_bf==1, | |,父→_parent→_bf==1) { 时间=cur 家长; 时间=parent cur→_parent; } 其他的 { if (父→_bf ==, 2) { null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null AVL树增删查找