扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
AVL树的性质
成都创新互联专业IDC数据服务器托管提供商,专业提供成都服务器托管,服务器租用,四川雅安服务器托管,四川雅安服务器托管,成都多线服务器托管等服务器托管服务。1. 左子树和右子树的高度之差的绝对值不超过1
2. 树中的每个左子树和右子树都是AVL树
3. 每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子是-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度 )
#pragma once templatestruct AVLTreeNode { K _key; V _value; AVLTreeNode * _left; AVLTreeNode * _right; AVLTreeNode * _parent; int _bf; //平衡因子 AVLTreeNode(const K& key, const V& value) : _key(key) , _value(value) , _left(NULL) , _right(NULL) , _parent(NULL) , _bf(0) {} }; template class AVLTree { typedef AVLTreeNode Node; public: AVLTree() : _root(NULL) {} ~AVLTree() {} public: //空树 //查找位置 //插入节点 //更新平衡因子 //如果进行了旋转调整,则将parent进行重新连接 bool Insert(const K& key, const V& value) { //空树 if (_root == NULL) { _root = new Node(key, value); return true; } //查找位置 Node* cur = _root; Node* parent = NULL; while (cur) { if (key > cur->_key) { parent = cur; cur = cur->_right; } else if (key < cur->_key) { parent = cur; cur = cur->_left; } else { return false; } } //插入节点 cur = new Node(key, value); if (key > parent->_key) { parent->_right = cur; cur->_parent = parent; } else { parent->_left = cur; cur->_parent = parent; } //更新平衡因子(右树-左树) bool isRotate = false; //定义标志位,记录是否旋转 while (parent) { if (parent->_left == cur)//插在parent的左边,平衡因子减1 { parent->_bf--; } else //插在parent的右边,平衡因子加1 { parent->_bf++; } if (parent->_bf == 0) break; else if (parent->_bf == 1 || parent->_bf == -1) { cur = parent; parent = cur->_parent; } else//旋转,调整平衡因子 2 -2 { isRotate = true; if (parent->_bf == 2) { if (cur->_bf == 1) { _RotateL(parent); } else //cur->_bf == -1 { _RotateRL(parent); } } else //parent->_bf == -2 { if (cur->_bf == -1) { _RotateR(parent); } else { _RotateLR(parent); } } break; } } if (isRotate) //true则表示进行了调整 { Node* GrandParent = parent->_parent; if (GrandParent == NULL) { _root = parent; } else { if (parent->_key < GrandParent->_key) { GrandParent->_left = parent; } else { GrandParent->_right = parent; } } } return true; } void InOrder() { _InOrder(_root); cout << endl; } bool IsBalanceTree() { return _IsBalanceTree(_root); } protected: bool _IsBalanceTree(Node* root) { if (root == NULL) { return true; } int left = _Height(root->_left); int right = _Height(root->_right); int bf = abs(right - left); if (bf > 1) { return false; } else if (bf != abs(root->_bf)) { cout << root->_bf << "平衡因子有误!" << endl; return false; } return _IsBalanceTree(root->_left) && _IsBalanceTree(root->_right); } //左单旋 void _RotateL(Node*& parent) { Node* subR = parent->_right; Node* subRL = subR->_left; parent->_right = subRL; if (subRL) { subRL->_parent = parent; } subR->_left = parent; subR->_parent = parent->_parent; parent->_parent = subR; parent->_bf = subR->_bf = 0; parent = subR; } void _RotateR(Node*& parent) { Node* subL = parent->_left; Node* subLR = subL->_right; parent->_left = subLR; if (subLR) { subLR->_parent = parent; } subL->_right = parent; subL->_parent = parent->_parent; parent->_parent = subL; parent->_bf = subL->_bf = 0; parent = subL; } void _RotateLR(Node*& parent) { Node* subL = parent->_left; Node* subLR = subL->_right; // 左单旋 subL->_right = subLR->_left; if (subLR->_left) { subLR->_left->_parent = subL; } subLR->_left = subL; subLR->_parent = subL->_parent; subL->_parent = subLR; if (subLR->_bf == 0 || subLR->_bf == -1) { subL->_bf = 0; } else // subLR->_bf == 1 { subL->_bf = -1; } // 右单旋 parent->_left = subLR->_right; if (subLR->_right) { subLR->_right->_parent = parent; } subLR->_right = parent; subLR->_parent = parent->_parent; parent->_parent = subLR; if (subLR->_bf == 0 || subLR->_bf == 1) { parent->_bf = 0; } else // subLR->_bf == -1 { parent->_bf = 1; } subLR->_bf = 0; parent = subLR; } void _RotateRL(Node*& parent) { Node* subR = parent->_right; Node* subRL = subR->_left; subR->_left = subRL->_right; if (subRL->_right) { subRL->_right->_parent = subR; } subRL->_right = subR; subR->_parent = subRL; if (subRL->_bf == 0 || subRL->_bf == 1) { subR->_bf = 0; } else { subR->_bf = 1; } parent->_right = subRL->_left; if (subRL->_left) { subRL->_left->_parent = parent; } subRL->_left = parent; subRL->_parent = parent->_parent; parent->_parent = subRL; if (subRL->_bf == 0 || subRL->_bf == -1) { parent->_bf = 0; } else { parent->_bf = -1; } subRL->_bf = 0; parent = subRL; } void _InOrder(Node* root) { if (root == NULL) { return; } _InOrder(root->_left); cout << root->_key << " "; _InOrder(root->_right); } int _Height(Node* root) { if (root == NULL) { return 0; } int left = _Height(root->_left) + 1; int right = _Height(root->_right) + 1; return left > right ? left : right; } protected: Node* _root; }; void TestAVL1() { AVLTree t; int a[] = { 16, 3, 7, 11, 9, 26, 18, 14, 15 }; for (int i = 0; i < sizeof(a) / sizeof(int); ++i) { t.Insert(a[i], i); } t.InOrder(); cout << "IsBlance?" << t.IsBalanceTree() << endl; } void TestAVL2() { AVLTree t; int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 }; for (int i = 0; i < sizeof(a) / sizeof(int); ++i) { t.Insert(a[i], i); t.InOrder(); } cout << "IsBlance?" << t.IsBalanceTree() << endl; }
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流