平衡二叉树的的插入

来源:互联网 发布:base.apk软件下载 编辑:程序博客网 时间:2024/05/16 15:39

平衡二叉树的建立:

#include <iostream>#include <vector>#include <map>using namespace std;  struct TreeNode {      int val;  int bf;      TreeNode *left;      TreeNode *right;      TreeNode(int x) : val(x),bf(0), left(NULL), right(NULL) {} }; class Solution {public:    TreeNode *sortedArrayToBST(vector<int> &num) {        TreeNode *root = NULL;for(size_t i=0;i<num.size();++i){root = createTree(root,num[i]);}printBST(root,2);return root;    }    private:   void printBST(TreeNode *root,int space){   if(root){      cout<<root->val<<endl;  if(root->left){  for(int i=0;i<space;++i)       cout<<" ";  }  printBST(root->left,space+2);  if(root->right) {  for(int i=0;i<space;++i)  cout<<" ";  }  printBST(root->right,space+2);   }   }      TreeNode *createNode(int val){       TreeNode *node = new TreeNode(val);       return node;   }   TreeNode *createTree(TreeNode *root,int val){       TreeNode *node = createNode(val);       TreeNode *p = root;       if(NULL==root) {           root = node;           return root;       }              TreeNode *a=root,*fa=NULL;//a表示距离插入位置最近,且平衡因子不为0的结点,fa表示a的父节点       TreeNode *pre=NULL;//pre表示插入结点的前驱结点   while(p){//找到插入结点   if(p->bf){      fa=pre;  a=p;   }   pre = p;           if(node->val >= p->val){//右转                p=p->right;           }else{               p=p->left;           }       }       if(node->val < pre->val){//插入结点           pre->left = node;       }else{           pre->right = node;       }   p=a;       while(p!=node){   if(node->val < p->val){       p->bf+=1;   p=p->left;   }else{   p->bf-=1;   p=p->right;   }   }   if(a->bf==2 || a->bf==-2){   if(a->bf==2 && a->left->bf==1){//LL型,结点插入不平衡结点的左子结点的左子树   p=LL_Rotate(a);   }else if(a->bf==2 && a->left->bf==-1){//LR型,结点插入不平衡结点的左子结点的右子树   p=LR_Rotate(a);   }else if(a->bf==-2 && a->right->bf==-1){//RR型,结点插入不平衡结点的右子结点的右子树   p=RR_Rotate(a);   }else if(a->bf==-2 && a->right->bf==1){//RL型,结点插入不平衡结点的右子结点的左子树   p=RL_Rotate(a);   }   if(fa){   if(node->val < fa->val){   fa->left = p;   }else{   fa->right = p;   }   }else{   root = p;   }   }       return root;   }private:   TreeNode* LL_Rotate(TreeNode *a){       TreeNode *ca=a->left;   a->left=ca->right;   ca->right=a;   a->bf=0;   ca->bf=0;   return ca;   }   TreeNode* LR_Rotate(TreeNode *a){   TreeNode *ca=a->left,*c=ca->right;   ca->right = c->left;   a->left = c->right;   c->left = ca;   c->right = a;   switch(c->bf){   case 1:ca->bf=0;a->bf=-1;break;//插入结点位于c的左子树   case 0:ca->bf=0;a->bf=0;break;//c是插入结点   case -1:ca->bf=1;a->bf=0;break;//插入结点位于c的右子树   }   c->bf=0;   return c;   }   TreeNode* RR_Rotate(TreeNode *a){   TreeNode *ca = a->right;   a->right = ca->left;   ca->left = a;   ca->bf=0;   a->bf=0;   return ca;   }   TreeNode* RL_Rotate(TreeNode *a){   TreeNode *ca=a->right,*c=ca->left;   ca->left = c->right;   a->right = c->left;   c->left = a;   c->right = ca;   switch(c->bf){   case 1:ca->bf=-1;a->bf=0;break;//插入结点位于c的左子树   case 0:ca->bf=0;a->bf=0;break;//c是插入结点   case -1:ca->bf=0;a->bf=1;break;//插入结点位于c的右子树   }   c->bf=0;   return c;   }};int main(){Solution s;int a[]={1,2,3,4,5,6,7,8,9};vector<int> v(a,a+9);s.sortedArrayToBST(v);return 0;}

0 0
原创粉丝点击