AVL树又叫自平衡二叉查找树,在效率上不比红黑树,但是是红黑树的基础!下面是构造一棵AVL树的完整代码!
- //AVLTree.h
- //参考:http://www.cppblog.com/goodwin/archive/2011/08/08/152797.html
- #ifndef _AVLTREE_H_
- #define _AVLTREE_H_
- #include "Stack.h"
- #include "Queue.h"
- #define SAFE_CALL(p) p == NULL ? NULL : p
- template <typename T>
- T Max(T a,T b)
- {
- return (a)>(b) ? (a) : (b);
- }
- namespace _AVL_Tree_
- {
- #define Balance(a) abs((SAFE_CALL(a->mpLeft)->mHeigh) - (SAFE_CALL(a->mpRight)->mHeigh))
- #define isLeftHigh(a) ((SAFE_CALL(a->mpLeft)->mHeigh) > (SAFE_CALL(a->mpRight)->mHeigh)) ? true : false
- #define isLeftTree(a,b) ((a)->mpLeft == (b)) ? true : false
- #define isRightTree(a,b) ((a)->mpRight == (b)) ? true : false
- typedef enum _position_
- {
- enPosi_Root = 0,
- enPosi_Left,
- enPosi_Right,
- enPosi_Equal,
- enPosiMax
- }POSITION;
- typedef enum _rotal_type_
- {
- enRotalType_Anonymous,
- enRotalType_LeftLeft = 1,
- enRotalType_RightRight,
- enRotalType_LeftRight,
- enRotalType_RightLeft,
- enRotalType_MaxType
- }RotalType;
- template <typename T>
- class TreeNode
- {
- public:
- TreeNode()
- {
- mHeigh = 0;
- mElement = T();
- mpLeft = mpRight = mpParent = NULL;
- }
- ~TreeNode()
- {
- mElement = T();
- mpLeft = mpRight = mpParent = NULL;
- }
- T mElement;
- int mHeigh;
- TreeNode<T>* mpLeft;
- TreeNode<T>* mpRight;
- TreeNode<T>* mpParent;
- };
- template <typename T>
- class AVLTree
- {
- public:
- AVLTree();
- ~AVLTree();
- bool insert(const T& element);
- bool remove(const T& element);
- bool clear();
- //POSITION:返回找到的插入点的位置,s:返回在遍历过程中从树根到找到的插入点的路径(主要是用来旋转用)。
- POSITION find(const T& element,Stack<TreeNode<T>*>& s);
- //中序遍历
- bool inorderTravel(void);
- //先序遍历
- bool prevorederTravel(void);
- //中序遍历,并把遍历的结果放到栈中,用户销毁这棵树。
- bool inorderTravel(Stack<TreeNode<T>*>& s);
- //求一棵树的最大长度的路径。
- bool getLongestPath(const TreeNode<T>* pRoot,Queue<TreeNode<T>*>& q);
- //检查是否是AVL树。
- bool checkIsAVLTree(void);
- //把AVL树的信息丰收放到文件中
- void saveAVLTreeToFile(const char* pFileName);
- protected:
- TreeNode<T>* CreateNode(const T& element);
- TreeNode<T>* RightRightRotal(TreeNode<T>* pNode);
- TreeNode<T>* LeftLeftRotal(TreeNode<T>* pNode);
- TreeNode<T>* LeftRightRotal(TreeNode<T>* pNode);
- TreeNode<T>* RightLeftRotal(TreeNode<T>* pNode);
- RotalType checkRotalType(TreeNode<T>* pPParentNode,TreeNode<T>* pParentNode,TreeNode<T>* pNode);
- TreeNode<T>* rotalTree(TreeNode<T>* pPParentNode,TreeNode<T>* pParentNode,TreeNode<T>* pNode);
- //当要进行旋转时,判定需求旋转的类型。
- RotalType checkRotalType(TreeNode<T>* pRootNode);
- //对以pRootNode为根的进行旋转
- TreeNode<T>* rotalTree(TreeNode<T>* pRootNode);
- //对树进行平衡处理
- bool balanceTree(TreeNode<T>* pRootNode);
- //获取节点pNode的中序遍历【前驱】节点
- TreeNode<T>* getPrevNode(TreeNode<T>* pNode);
- //获取节点pNode的中序遍历【后继】节点
- TreeNode<T>* getNextNode(TreeNode<T>* pNode);
- private:
- TreeNode<T>* mpRoot;
- };
- template <typename T>
- AVLTree<T>::AVLTree()
- {
- mpRoot = new TreeNode<T>;
- if (!mpRoot) throw("malloc memery failed.");
- mpRoot->mElement = -1;
- mpRoot->mHeigh = 0;
- mpRoot->mpLeft = mpRoot->mpParent = mpRoot->mpRight = NULL;
- }
- template <typename T>
- AVLTree<T>::~AVLTree()
- {
- this->clear();
- delete this->mpRoot;
- this->mpRoot = NULL;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::CreateNode(const T& element)
- {
- TreeNode<T>* pNode = new TreeNode<T>;
- if (pNode)
- {
- pNode->mElement = element;
- pNode->mpLeft = pNode->mpRight = pNode->mpParent = NULL;
- pNode->mHeigh = 1;
- return pNode;
- }
- return NULL;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::RightRightRotal(TreeNode<T>* pNode)
- {
- TreeNode<T>* pRightChild = pNode->mpRight;
- //cout << "RightRightRotal mElement:" << pNode->mElement << endl;
- pNode->mHeigh = Max((SAFE_CALL(pNode->mpLeft)->mHeigh),(SAFE_CALL(pRightChild->mpLeft)->mHeigh)) + 1;
- pRightChild->mHeigh = Max((SAFE_CALL(pRightChild->mpRight)->mHeigh),(pNode->mHeigh)) + 1;
- pNode->mpRight = pRightChild->mpLeft;
- if (pRightChild->mpLeft && pRightChild->mpLeft->mpParent)
- {
- pRightChild->mpLeft->mpParent = pNode;
- }
- pRightChild->mpLeft = pNode;
- pNode->mpParent = pRightChild;
- return pRightChild;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::LeftLeftRotal(TreeNode<T>* pNode)
- {
- TreeNode<T>* pLeftChild = pNode->mpLeft;
- //cout << "LeftLeftRotal mElement:" << pNode->mElement << endl;
- pNode->mHeigh = Max((SAFE_CALL(pLeftChild->mpRight)->mHeigh),(SAFE_CALL(pNode->mpRight)->mHeigh)) + 1;
- pLeftChild->mHeigh = Max((SAFE_CALL(pLeftChild->mpLeft)->mHeigh),pNode->mHeigh) + 1;
- pNode->mpLeft = pLeftChild->mpRight;
- if (pLeftChild->mpRight && pLeftChild->mpRight->mpParent)
- {
- pLeftChild->mpRight->mpParent = pNode;
- }
- pLeftChild->mpRight = pNode;
- pNode->mpParent = pLeftChild;
- return pLeftChild;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::LeftRightRotal(TreeNode<T>* pNode)
- {
- TreeNode<T>* pLeftChild = pNode->mpLeft;
- TreeNode<T>* pTmp = pLeftChild;
- //左旋转
- pLeftChild = this->RightRightRotal(pLeftChild);
- pNode->mpLeft = pLeftChild;
- pLeftChild->mpParent = pNode;
- pTmp->mpParent = pLeftChild;
- //右旋转
- pNode =this->LeftLeftRotal(pNode);
- return pNode;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::RightLeftRotal(TreeNode<T>* pNode)
- {
- TreeNode<T>* pRightChild = pNode->mpRight;
- TreeNode<T>* pTmp = pRightChild;
- //右旋转
- pRightChild = this->LeftLeftRotal(pRightChild);
- pNode ->mpRight = pRightChild;
-
- pRightChild->mpParent = pNode;
- pTmp->mpParent = pRightChild;
- //左旋转
- pNode = this->RightRightRotal(pNode);
- return pNode;
- }
- template <typename T>
- RotalType AVLTree<T>::checkRotalType(TreeNode<T>* pPParentNode,TreeNode<T>* pParentNode,TreeNode<T>* pNode)
- {
- bool bPLeft = false,bLeft = false;
- if (pPParentNode->mpLeft == pParentNode)
- bPLeft = true;
- else
- bPLeft = false;
- if (pParentNode->mpLeft == pNode)
- bLeft = true;
- else
- bLeft = false;
- RotalType type ;
- if (bPLeft && bLeft)
- type = enRotalType_LeftLeft;
- else if (!bPLeft && bLeft)
- type = enRotalType_RightLeft;
- else if(bPLeft && !bLeft)
- type = enRotalType_LeftRight;
- else if (!bPLeft && !bLeft )
- type = enRotalType_RightRight;
- return type;
- }
- template <typename T>
- TreeNode<T>* AVLTree<T>::rotalTree(TreeNode<T>* pPParentNode,TreeNode<T>* pParentNode,TreeNode<T>* pNode)
- {
- RotalType type = this->checkRotalType(pPParentNode,pParentNode,pNode);
- switch (type)
- {
- case enRotalType_LeftLeft:
- {
- return this->LeftLeftRotal(pPParentNode);
- }
- case enRotalType_RightRight:
- {
- return this->RightRightRotal(pPParentNode);
- break;
- }
- case enRotalType_LeftRight:
- {
- return this->LeftRightRotal(pPParentNode);
- break;
- }
- case enRotalType_RightLeft:
- {
- return this->RightLeftRotal(pPParentNode);
- break;
- }
- }
- return NULL;
- }
- //当要进行旋转时,判定需求旋转的类型。
- template <typename T>
- RotalType AVLTree<T>::checkRotalType(TreeNode<T>* pRootNode)
- {
- RotalType type = enRotalType_Anonymous;
- if (Balance(pRootNode) >= 2)
- {
- bool bCLeft = false,bCCLeft = false;
- Queue<TreeNode<T>*> q;
- this->getLongestPath(pRootNode,q);
- TreeNode<T>* pChildNode = q.front(); //先把树根出列
- pChildNode= q.front();
- bCLeft = (pRootNode->mpLeft == pChildNode);
- TreeNode<T>* pCChildNode = q.front();
- bCCLeft = (pChildNode->mpLeft == pCChildNode);
- q.clear();
- if (bCLeft && bCCLeft)
- type = enRotalType_LeftLeft;
- else if (!bCLeft && bCCLeft)
- type = enRotalType_RightLeft;
- else if(bCLeft && !bCCLeft)
- type = enRotalType_LeftRight;
- else if (!bCLeft && !bCCLeft )
- type = enRotalType_RightRight;
- }
- return type;
- }
-
- //对以pRootNode为根的进行旋转
- template <typename T>
- TreeNode<T>* AVLTree<T>::rotalTree(TreeNode<T>* pRootNode)
- {
- RotalType type = this->checkRotalType(pRootNode);
- switch (type)
- {
- case enRotalType_Anonymous:
- {
- return NULL;
- }
- case enRotalType_LeftLeft:
- {
- return this->LeftLeftRotal(pRootNode);
- }
- case enRotalType_RightRight:
- {
- return this->RightRightRotal(pRootNode);
- }
- case enRotalType_LeftRight:
- {
- return this->LeftRightRotal(pRootNode);
- }
- case enRotalType_RightLeft:
- {
- return this->RightLeftRotal(pRootNode);
- }
- }
- return NULL;
- }
- //对树进行平衡处理
- template <typename T>
- bool AVLTree<T>::balanceTree(TreeNode<T>* pRootNode)
- {
- while (pRootNode && pRootNode != this->mpRoot)
- {
- pRootNode->mHeigh = Max((SAFE_CALL(pRootNode->mpLeft)->mHeigh) , (SAFE_CALL(pRootNode->mpRight)->mHeigh)) + 1;
- if (Balance(pRootNode) >= 2)
- {
- bool bLeft = false;
- TreeNode<T>* pPPNode = pRootNode->mpParent;
- bLeft = (pPPNode->mpLeft == pRootNode);
- pRootNode = this->rotalTree(pRootNode);
- if (bLeft)
- pPPNode->mpLeft = pRootNode;
- else
- pPPNode->mpRight = pRootNode;
- pRootNode->mpParent = pPPNode;
- }
- pRootNode = pRootNode->mpParent;
- }
- return true;
- }
- //获取节点pNode的中序遍历【前驱】节点
- template <typename T>
- TreeNode<T>* AVLTree<T>::getPrevNode(TreeNode<T>* pNode)
- {
- TreeNode<T>* pTmpNode = pNode->mpLeft;
- while (pTmpNode && pTmpNode->mpRight)
- pTmpNode = pTmpNode->mpRight;
- return pTmpNode;
- }
- //获取节点pNode的中序遍历【后继】节点
- template <typename T>
- TreeNode<T>* AVLTree<T>::getNextNode(TreeNode<T>* pNode)
- {
- TreeNode<T>* pTmpNode = pNode->mpRight;
- while (pTmpNode && pTmpNode->mpLeft)
- pTmpNode = pTmpNode->mpLeft;
- return pTmpNode;
- }
- template <typename T>
- bool AVLTree<T>::insert(const T& element)
- {
- TreeNode<T>* pNode = NULL;
- TreeNode<T>* pInNode = NULL; //插入点节点
- Stack<TreeNode<T>*> s;
- POSITION pos = this->find(element,s);
- switch (pos)
- {
- case enPosi_Equal:
- {
- static int iCount = 0;
- cout << "----enPosi_Equal--iCount:"<<++iCount<<"--element:"<< element << endl;
- break;
- }
- case enPosi_Root:
- {
- pNode = this->CreateNode(element);
- this->mpRoot->mpLeft = pNode;
- pNode->mpParent = this->mpRoot;
- break;
- }
- case enPosi_Left:
- {
- pNode = this->CreateNode(element);
- pInNode = s.pop();
- pInNode->mpLeft = pNode;
- pNode->mpParent = pInNode;
- pInNode->mHeigh = Max((SAFE_CALL(pInNode->mpLeft)->mHeigh) ,(SAFE_CALL(pInNode->mpRight)->mHeigh)) + 1;
- TreeNode<T>* pParentNode = pInNode->mpParent;
- if (pParentNode && pParentNode != this->mpRoot)
- {
- this->balanceTree(pParentNode);
- }
- break;
- }
- case enPosi_Right:
- {
- pNode = this->CreateNode(element);
- TreeNode<T>* pInNode = s.pop();
- pInNode->mpRight = pNode;
- pNode->mpParent = pInNode;
- pInNode->mHeigh = Max((SAFE_CALL(pInNode->mpRight)->mHeigh) , (SAFE_CALL(pInNode->mpLeft)->mHeigh)) + 1;
- TreeNode<T>* pParentNode = pInNode->mpParent;
- if (pParentNode && pParentNode != this->mpRoot)
- {
- this->balanceTree(pParentNode);
- }
- break;
- }
- }
- s.clear();
- return true;
- }
- template <typename T>
- bool AVLTree<T>::remove(const T& element)
- {
- TreeNode<T>* pDelNode = NULL; //插入点节点
- Stack<TreeNode<T>*> s;
- POSITION pos = this->find(element,s);
- if (s.isEmpty()) goto OVER;
- switch (pos)
- {
- case enPosi_Equal:
- {
- pDelNode = s.pop();
- if (pDelNode->mpLeft == NULL && pDelNode->mpRight == NULL)
- {//1.删除的节点没有子树
- TreeNode<T>* pParentNode = pDelNode->mpParent;
- if (pParentNode && isLeftTree(pParentNode,pDelNode))
- pParentNode->mpLeft = NULL;
- else if(pParentNode && isRightTree(pParentNode,pDelNode))
- pParentNode->mpRight = NULL;
- this->balanceTree(pParentNode);
- delete pDelNode;
- pDelNode = NULL;
- }
- else if((pDelNode->mpLeft && pDelNode->mpRight == NULL) ||
- (pDelNode->mpLeft == NULL && pDelNode->mpRight))
- {//2.删除的节点有一子树
- TreeNode<T>* pChildNode = pDelNode->mpLeft;
- if(!pChildNode)
- pChildNode = pDelNode->mpRight;
- TreeNode<T>* pParentNode = pDelNode->mpParent;
- if (pParentNode && isLeftTree(pParentNode,pDelNode))
- {// 2.1、删除的结点是其父节点的左子树
- pParentNode->mpLeft = pChildNode;
- pChildNode->mpParent = pParentNode;
- this->balanceTree(pParentNode);
- }
- else if(pParentNode && isRightTree(pParentNode,pDelNode))
- {//2.2、删除的结点是其父节点的右子树
- pParentNode->mpRight = pChildNode;
- pChildNode->mpParent = pParentNode;
- this->balanceTree(pParentNode);
- }
- delete pDelNode;
- pDelNode = NULL;
- }
- else if (pDelNode->mpLeft && pDelNode->mpRight)
- {//3、删除的节点有左右子树
- /*
- 有两种做法,要删除p的节点:
- 1.把p的左子树设成其父节点的左子树,把p的右子树设成其实左子树的最右边的叶子节点。
- 2.把p的【直接前驱(中序)】替换p,然后把【前驱】的左子树替换成【前驱】的右子树。
- 以下实现是利用第2种方法。
- */
- if (pDelNode->mpLeft->mHeigh >= pDelNode->mpRight->mHeigh)
- {//左子树比右子树高,就用pDelNode的【前驱】替换
- TreeNode<T>* pPrevNode = this->getPrevNode(pDelNode);
- pDelNode->mElement = pPrevNode->mElement;
- TreeNode<T>* pParentNode = pPrevNode->mpParent;
- pParentNode->mpRight = pPrevNode->mpLeft;
- if (pPrevNode->mpLeft)
- pPrevNode->mpLeft->mpParent = pParentNode;
-
- this->balanceTree(pParentNode);
- delete pPrevNode;
- pPrevNode = NULL;
- }
- else
- {//右子树比左子树高,就用pDelNode的【后继】替换
- TreeNode<T>* pNextNode = this->getNextNode(pDelNode);
- pDelNode->mElement = pNextNode->mElement;
- TreeNode<T>* pParentNode = pNextNode->mpParent;
- pParentNode->mpLeft = pNextNode->mpRight;
- if(pNextNode->mpRight)
- pNextNode->mpRight->mpParent = pParentNode;
- this->balanceTree(pParentNode);
- delete pNextNode;
- pNextNode = NULL;
- }
- }
- break;
- }
- default:
- {
- goto OVER;
- break;
- }
- }
- OVER:
- s.clear();
- return true;
- }
- template <typename T>
- bool AVLTree<T>::clear()
- {
- Stack<TreeNode<T>*> s;
- this->inorderTravel(s);
- TreeNode<T>* pNode = NULL;
- while ((pNode= s.pop()) != NULL)
- delete pNode;
- return true;
- }
- //POSITION:返回找到的插入点的位置,s:返回在遍历过程中从树根到找到的插入点的路径(主要是用来旋转用)。
- template <typename T>
- POSITION AVLTree<T>::find(const T& element,Stack<TreeNode<T>* >& s)
- {
- TreeNode<T>* pNode = this->mpRoot->mpLeft;
- POSITION pos = enPosi_Root;
- while (pNode)
- {
- s.push(pNode);
- if (element == pNode->mElement)
- {
- pos = enPosi_Equal;
- break;
- }
- else if (element < pNode->mElement)
- {
- pos = enPosi_Left;
- if (pNode->mpLeft)
- pNode = pNode->mpLeft;
- else
- break;
- }
- else if (element > pNode->mElement)
- {
- pos = enPosi_Right;
- if (pNode->mpRight)
- pNode = pNode->mpRight;
- else
- break;
- }
- }
- return pos;
- }
- //中序遍历
- template <typename T>
- bool AVLTree<T>::inorderTravel(void)
- {
- TreeNode<T>* pNode = this->mpRoot->mpLeft;
- if (pNode)
- {
- Stack<TreeNode<T>*> s;
- while (pNode || !s.isEmpty())
- {
- while (pNode)
- {
- s.push(pNode);
- pNode = pNode->mpLeft;
- }
- pNode = s.pop();
- if (pNode)
- {
- cout << pNode->mElement << " ";
- pNode = pNode->mpRight;
- }
- }
- }
- return true;
- }
- //先序遍历
- template <typename T>
- bool AVLTree<T>::prevorederTravel(void)
- {
- TreeNode<T>* pNode = this->mpRoot->mpLeft;
- if (pNode)
- {
- Stack<TreeNode<T>*> s;
- while (pNode || !s.isEmpty())
- {
- while (pNode)
- {
- cout << pNode->mElement << " ";
- s.push(pNode);
- pNode = pNode->mpLeft;
- }
- pNode = s.pop();
- if (pNode)
- pNode = pNode->mpRight;
- }
- }
- return true;
- }
- //中序遍历,并把遍历的结果放到栈中,用户销毁这棵树。
- template <typename T>
- bool AVLTree<T>::inorderTravel(Stack<TreeNode<T>*>& s)
- {
- TreeNode<T>* pNode = this->mpRoot->mpLeft;
- if (pNode)
- {
- Stack<TreeNode<T>*> sTmp;
- while (pNode || !sTmp.isEmpty())
- {
- while (pNode)
- {
- sTmp.push(pNode);
- pNode = pNode->mpLeft;
- }
- pNode = sTmp.pop();
- if (pNode)
- {
- s.push(pNode);
- pNode = pNode->mpRight;
- }
- }
- }
- return true;
- }
- //求一棵树的最大长度的路径。
- template <typename T>
- bool AVLTree<T>::getLongestPath(const TreeNode<T>* pRoot,Queue<TreeNode<T>*>& q)
- {
- if (!pRoot) return false;
- q.insert((TreeNode<T>*)(pRoot));
- if ((SAFE_CALL(pRoot->mpLeft)->mHeigh) >= (SAFE_CALL(pRoot->mpRight)->mHeigh))
- return getLongestPath(pRoot->mpLeft,q);
- else
- return getLongestPath(pRoot->mpRight,q);
- return true;
- }
- //检查是否是AVL树。
- template <typename T>
- bool AVLTree<T>::checkIsAVLTree(void)
- {
- Stack<TreeNode<T>*> s;
- this->inorderTravel(s);
- TreeNode<T>* pNode = NULL;
- while ((pNode= s.pop()) != NULL)
- {
- cout << "[" << pNode->mElement<<"]" \
- <<" Height:" << pNode->mHeigh \
- <<" Left:" << (SAFE_CALL(pNode->mpLeft)->mHeigh) \
- <<" Rigth:"<< (SAFE_CALL(pNode->mpRight)->mHeigh) \
- <<" bala:" << Balance(pNode) << endl;
- }
- return true;
- }
- #include <fstream>
- using namespace std;
- //把AVL树的信息丰收放到文件中
- template <typename T>
- void AVLTree<T>::saveAVLTreeToFile(const char* pFileName)
- {
- if (!pFileName) return;
- FILE* pFile = fopen(pFileName,"w");
- if (!pFile)
- {
- cout << "open file failed." << endl ;
- return ;
- }
- char tmpBuf[512] = {0};
- Stack<TreeNode<T>*> s;
- this->inorderTravel(s);
- sprintf(tmpBuf,"TreeSize: %d\r\n",s.size());
- fwrite(tmpBuf,strlen(tmpBuf),1,pFile);
- TreeNode<T>* pNode = NULL;
- int iMaxHeigh = 0;
- while ((pNode= s.pop()) != NULL)
- {
- if (pNode->mHeigh > iMaxHeigh)
- {
- iMaxHeigh = pNode->mHeigh;
- }
- sprintf(tmpBuf,"[%d]--Hegigh:%d--Left:%d--Right:%d--Bala:%d\r\n",
- pNode->mElement,
- pNode->mHeigh,
- (SAFE_CALL(pNode->mpLeft)->mHeigh),
- (SAFE_CALL(pNode->mpRight)->mHeigh),
- Balance(pNode));
- fwrite(tmpBuf,strlen(tmpBuf),1,pFile);
- }
- sprintf(tmpBuf,"iMaxHeigh: %d\r\n",iMaxHeigh);
- fwrite(tmpBuf,strlen(tmpBuf),1,pFile);
- fclose(pFile);
- pFile = NULL;
- }
- }
- #endif
/******************************测试函数*****************************************///
- #include <stdexcept>
- #include <typeinfo>
- #include <iostream>
- #include <fstream>
- using namespace std;
- #include "AVLTree.h"
- #include "Stack.h"
- #include "Queue.h"
- using namespace _AVL_Tree_;
- #include <time.h>
- #define ARRY_SIZE 1000
- int main(int argc,char** argv)
- {
- AVLTree<int> tree;
- // int arr[] = {1,2,3};//RR
- // int arr[] = {3,2,1};//LL
- // int arr[] = {2,4,3};//RL
- // int arr[] = {4,2,3};//LR
- // int arr[] = {10,5,3,7,6,8,12,54,11}; //删除8后,还要再次平衡处理右子树
- // int arr[] = {100,50,30,70,60,80,120,540,110,51,75,112,85,78,71}; //删除 后,还要再次平衡处理左子树85,71,78,79
- int arr[ARRY_SIZE] = {0};
- srand((unsigned int)time(NULL));
- for (int i = 0; i < ARRY_SIZE; i++)
- {
- arr[i] = (rand() % ARRY_SIZE) + 1;
- }
- size_t size = sizeof(arr) / sizeof(int);
-
- for (size_t i = 0; i < size; i++)
- {
- tree.insert(arr[i]);
- }
- cout << "Befor Inorder:";
- tree.inorderTravel();
- cout << "\nBefor Preorder:";
- tree.prevorederTravel();
- tree.saveAVLTreeToFile("AVLResult.txt");
- cout << "\r\nAVLTree Result writes in file AVLResult.txt." << endl;
- getchar();
- return 0;
- }
///*****************************C++实现栈***************************************///
- //Stack.h
- //双链表栈数据结构C++模块的实现
- //理论知识参考《数据结构(C语言版)--严慰明》
- #ifndef _STACK_H_
- #define _STACK_H_
- #include <iostream>
- using namespace std;
- namespace _STACK_
- {
- //栈中的元素
- template <typename T>
- class StackNode
- {
- public:
- StackNode()
- {
- this->mElement = 0;
- this->mpNext = NULL;
- this->mpPrev = NULL;
- }
-
- ~StackNode()
- {
- this->mElement = 0;
- this->mpNext = NULL;
- this->mpPrev = NULL;
- }
-
- T& getElement(void)
- {
- return mElement;
- }
-
- //重载"<<"操作符,以便对栈节点输出,注意以friend重载“<<”操作符要加上"<>"
- friend ostream& operator << <>(ostream& ost,StackNode<T>& src)
- {
- ost << src.mElement;
- return ost;
- }
-
- //protected:
- T mElement; //存放的数据
- StackNode<T>* mpNext; //指向后继节点指针
- StackNode<T>* mpPrev; //指向前驱节点指针
- template <typename T>
- friend class Stack;
- };
- template <typename T>
- class Stack
- {
- public:
- Stack();
- ~Stack();
- bool push(const T& element);
- T pop(void);
- bool isEmpty(void);
- bool clear(void);
- int size();
- friend ostream& operator<< <>(ostream& ost,Stack<T>& src);
- protected:
- StackNode<T>* createNode(const T& element);
- protected:
- StackNode<T>* mpHead;
- StackNode<T>* mpTop;
- };
- template <typename T>
- Stack<T>::Stack()
- {
- T i = T();
- //创建一个带有头节点的双链栈,这个节点不存入任何数据
- this->mpHead = this->createNode(i);
- this->mpTop = this->mpHead;
- }
- template <typename T>
- Stack<T>::~Stack()
- {
- this->clear();
- delete this->mpHead;
- this->mpHead = NULL;
- this->mpTop = NULL;
- }
- template <typename T>
- StackNode<T>* Stack<T>::createNode(const T& element)
- {
- StackNode<T>* pNode = new StackNode<T>;
- if (pNode)
- {
- pNode->mElement = element;
- pNode->mpNext = NULL;
- pNode->mpPrev = NULL;
- }
- return pNode;
- }
- template <typename T>
- bool Stack<T>::push(const T& element)
- {
- StackNode<T>* pNode = createNode(element);
- if(this->mpHead->mpNext == NULL)
- {
- this->mpHead->mpNext = pNode;
- pNode->mpPrev = this->mpHead;
- }
- else
- {
- this->mpTop->mpNext = pNode;
- pNode->mpPrev = this->mpTop;
- }
- this->mpTop = pNode;
- return true;
- }
- template <typename T>
- T Stack<T>::pop(void)
- {
- if (this->mpTop != this->mpHead)
- {
- StackNode<T>* pNode = this->mpTop;
- this->mpTop = this->mpTop->mpPrev;
- T elem = pNode->mElement;
- pNode ->mpNext = pNode->mpPrev = NULL;
- delete pNode;
- pNode = NULL;
- return elem;
- }
- return (T)0;
- }
- template <typename T>
- bool Stack<T>::isEmpty(void)
- {
- return (this->mpHead == this->mpTop);
- }
- template <typename T>
- bool Stack<T>::clear(void)
- {
- StackNode<T>* pNode = this->mpTop;
- while((pNode = this->mpTop) != this->mpHead)
- {
- this->mpTop =pNode->mpPrev;
- pNode->mpNext = NULL;
- pNode->mpPrev = NULL;
- delete pNode;
- pNode = NULL;
- }
- return true;
- }
- template <typename T>
- int Stack<T>::size()
- {
- int iCount = 0;
- StackNode<T>* pNode = this->mpTop;
- while(pNode != this->mpHead)
- {
- iCount++;
- pNode = pNode->mpPrev;
- }
- return iCount;
- }
- template <typename T>
- ostream& operator<< <>(ostream& ost,Stack<T>& src)
- {
- StackNode<T>* pNode = src.mpTop;
- while( src.mpHead)
- {
- ost << *pNode << " ";
- pNode = pNode->mpPrev;
- }
- return ost;
- }
- }
- #endif
///***************************************C++实现队列*********************************
- //Queue.h
- //双链表队列数据结构C++模块的实现
- //理论知识参考《数据结构(C语言版)--严慰明》
- #ifndef _QUEUE_H_
- #define _QUEUE_H_
- namespace _QUEUE_
- {
- //队列中的数据元素
- template <typename T>
- class QueueNode
- {
- public:
- QueueNode()
- {
- this->mElement = 0;
- this->mpNext = this->mpPrev = NULL;
- }
- T mElement;
- QueueNode<T>* mpNext;
- QueueNode<T>* mpPrev;
- };
- template <typename T>
- class Queue
- {
- public:
- Queue()
- {
- QueueNode<T> * pNode = new QueueNode<T>;
- pNode->mElement = T(-1);
- pNode->mpNext = pNode->mpPrev = NULL;
- this->mpHead = this->mpTail = pNode;
- }
- ~Queue()
- {
- this->clear();
- delete this->mpHead;
- this->mpHead = this->mpTail = NULL;
- }
- bool insert(T element);
- T front();
- T back();
- bool isEmpty(void);
- bool clear(void);
- int size();
- friend ostream& operator<< <>(ostream& ostr,const Queue<T>& q);
- private:
- QueueNode<T>* mpHead;
- QueueNode<T>* mpTail;
- };
- template <typename T>
- bool Queue<T>::insert(T element)
- {
- QueueNode<T> * pNode = new QueueNode<T>;
- if (pNode == NULL) return false;
- pNode->mElement = element;
- this->mpTail->mpNext = pNode;
- pNode->mpPrev = this->mpTail;
- this->mpTail = this->mpTail->mpNext;
- return true;
- }
- template <typename T>
- T Queue<T>::front()
- {
- T element = T();
- QueueNode<T>* pNode = NULL;
- if (!this->isEmpty())
- {
- pNode = this->mpHead->mpNext;
- element = pNode->mElement;
- this->mpHead ->mpNext = pNode->mpNext;
- if (pNode->mpNext)
- pNode->mpNext->mpPrev = this->mpHead;
- if (pNode == this->mpTail)
- this->mpTail = this->mpHead;
- delete pNode;
- }
- return element;
- }
- template <typename T>
- T Queue<T>::back()
- {
- T element = T();
- QueueNode<T>* pNode = NULL;
- if (!this->isEmpty())
- {
- pNode = this->mpTail;
- element = pNode->mElement;
- this->mpTail = this->mpTail->mpPrev;
- this->mpTail->mpNext = NULL;
- delete pNode;
- }
- return element;
- }
- template <typename T>
- bool Queue<T>::isEmpty(void)
- {
- return (this->mpTail == this->mpHead);
- }
- template <typename T>
- bool Queue<T>::clear(void)
- {
- while (!this->isEmpty())
- this->back();
- return true;
- }
- template <typename T>
- int Queue<T>::size()
- {
- int iCount = 0;
- if (!this->isEmpty())
- {
- QueueNode<T>* pNode = this->mpTail;
- while (pNode != this->mpHead)
- {
- iCount++;
- pNode = pNode->mpPrev;
- }
- }
- return iCount;
- }
- template <typename T>
- ostream& operator<< <>(ostream& ostr,const Queue<T>& q)
- {
- QueueNode<T>* pNode = q.mpHead->mpNext;
- while (pNode != NULL)
- {
- ostr << pNode->mElement << ",";
- pNode = pNode->mpNext;
- }
- return ostr;
- }
- }
- #endif