⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avltree.cpp

📁 Static Timing Analyzer
💻 CPP
字号:
#include "datadef.h"Boolean idAVLTree::Rebalance(idAVLTreeNode *unbal, idAVLTreeNode *unbalp){    Boolean ans;    idAVLTreeNode *unbalc,*unbalcc;    if (unbal->bf>1)  /* Left Rotate */    {   unbalc=unbal->LeftTree;        if (unbalc->bf==1)  /* Type LL */        {   unbal->LeftTree=unbalc->RightTree;            unbalc->RightTree=unbal;            unbal->bf=unbalc->bf=0;            ans=TRUE;        }        else if (unbalc->bf==0)  /* Type LL (another kind) */        {   unbal->LeftTree=unbalc->RightTree;            unbalc->RightTree=unbal;            unbal->bf=1;            unbalc->bf=-1;            ans=FALSE;        }        else  /* Type LR */        {   unbalcc=unbalc->RightTree;            unbalc->RightTree=unbalcc->LeftTree;            unbal->LeftTree=unbalcc->RightTree;            unbalcc->LeftTree=unbalc;            unbalcc->RightTree=unbal;            switch (unbalcc->bf)            {   case 1:   /* Type LRL */                    unbal->bf=-1;                    unbalc->bf=0;                    break;                case -1:  /* Type LRR */                    unbalc->bf=1;                    unbal->bf=0;                    break;                case 0:   /* Type LR */                    unbal->bf=0;                    unbalc->bf=0;                    break;            }            unbalcc->bf=0;            unbalc=unbalcc;            ans=TRUE;        }    }    else if (unbal->bf<-1)  /* Right Rotate */    {   unbalc=unbal->RightTree;        if (unbalc->bf==-1)  /* Type RR */        {   unbal->RightTree=unbalc->LeftTree;            unbalc->LeftTree=unbal;            unbal->bf=unbalc->bf=0;            ans=TRUE;        }        else if (unbalc->bf==0)  /* Type RR (another kind) */        {   unbal->RightTree=unbalc->LeftTree;            unbalc->LeftTree=unbal;            unbal->bf=-1;            unbalc->bf=1;            ans=FALSE;        }        else  /* Type RL */        {   unbalcc=unbalc->LeftTree;            unbalc->LeftTree=unbalcc->RightTree;            unbal->RightTree=unbalcc->LeftTree;            unbalcc->LeftTree=unbal;            unbalcc->RightTree=unbalc;            switch (unbalcc->bf)            {   case 1:   /* Type RLL */                    unbalc->bf=-1;                    unbal->bf=0;                    break;                case -1:  /* Type RLR */                    unbal->bf=1;                    unbalc->bf=0;                    break;                case 0:   /* Type RL */                    unbal->bf=0;                    unbalc->bf=0;                    break;            }            unbalcc->bf=0;            unbalc=unbalcc;            ans=TRUE;        }    }    if (!unbalp) Root=unbalc;    else if (unbal==unbalp->LeftTree) unbalp->LeftTree=unbalc;    else if (unbal==unbalp->RightTree) unbalp->RightTree=unbalc;    return ans;}Boolean idAVLTree::search_delkey(Boolean *result, GateId key,                                 idAVLTreeNode *curr,idAVLTreeNode *currp){    Boolean ans;    if (!curr) return FALSE;    else if (key < curr->elem->id)    {   if ((search_delkey(result,key,curr->LeftTree,curr))==TRUE)        {   (curr->bf)--;            if (curr->bf==0) ans=TRUE;            else ans=FALSE;        }        else ans=FALSE;    }    else if (key > curr->elem->id)    {   if ((search_delkey(result,key,curr->RightTree,curr))==TRUE)        {   (curr->bf)++;            if (curr->bf==0) ans=TRUE;            else ans=FALSE;        }        else ans=FALSE;    }    else    {   Gate *moved;        (*result)=TRUE;        if (curr->bf<0)        {   if ((get_rhead(&moved,curr->RightTree,curr,-1))==TRUE)            {   (curr->bf)++;                if (curr->bf==0) ans=TRUE;                else ans=FALSE;            }            else ans=FALSE;            curr->elem=moved;            return ans;        }        else        {   if (curr->LeftTree)            {  if ((get_rhead(&moved,curr->LeftTree,curr,1))==TRUE)                {   (curr->bf)--;                    if (curr->bf==0) ans=TRUE;                    else ans=FALSE;                }                else ans=FALSE;                curr->elem=moved;                return ans;            }            else            {   if (!currp) Root=NULL;                else if (curr==currp->RightTree) currp->RightTree=NULL;                else if (curr==currp->LeftTree) currp->LeftTree=NULL;                delete curr;                return TRUE;            }        }    }    if (curr->bf>1 || curr->bf<-1)    {   if ((Rebalance(curr,currp))==TRUE) ans=TRUE;        else ans=FALSE;    }    return ans;}Boolean idAVLTree::get_rhead(Gate **moved, idAVLTreeNode *curr,                             idAVLTreeNode *curp, int dirc){    if (dirc>0)    {   if (curr->RightTree)        {   if ((get_rhead(moved,curr->RightTree,curr,dirc))==TRUE)            {   (curr->bf)++;                if (curr->bf>1)                {   if ((Rebalance(curr,curp))==TRUE) return TRUE;                    else return FALSE;                }                else if (curr->bf==0) return TRUE;            }            return FALSE;        }        else        {   *moved=curr->elem;            if (curr==curp->RightTree) curp->RightTree=curr->LeftTree;            else curp->LeftTree=curr->LeftTree;            delete curr;            return TRUE;        }    }    else    {   if (curr->LeftTree)        {   if ((get_rhead(moved,curr->LeftTree,curr,dirc))==TRUE)            {   (curr->bf)--;                if (curr->bf<-1)                {   if ((Rebalance(curr,curp))==TRUE) return TRUE;                    else return FALSE;                }                else if (curr->bf==0) return TRUE;            }            return FALSE;        }        else        {   *moved=curr->elem;            if (curr==curp->LeftTree) curp->LeftTree=curr->RightTree;            else curp->RightTree=curr->RightTree;            delete curr;            return TRUE;        }    }}void idAVLTree::deltree(idAVLTreeNode *treeroot){    if (treeroot->LeftTree) deltree(treeroot->LeftTree);    if (treeroot->RightTree) deltree(treeroot->RightTree);    GateList *curr, *delnode;    curr = treeroot->elem->fanout;    while (curr) {       delnode = curr;       curr = curr->next;       delete delnode;    }    delete treeroot->elem;    delete treeroot;}void idAVLTree::dumptree(idAVLTreeNode *treeroot,int level){    if (treeroot->LeftTree) dumptree(treeroot->LeftTree,level+1);    for (int i=0;i<level;i++) printf(" ");    printf("Gate %d, Type %d, Inputs %d, Fanouts %d (bf=%d)\n",           treeroot->elem->id,treeroot->elem->type,treeroot->elem->inno,           treeroot->elem->outno,treeroot->bf);    GateList *curr = treeroot->elem->fanout;    while (curr) {       for (int i=0;i<level;i++) printf(" ");       printf("--> Gate %d\n",curr->cgate->id);       curr = curr->next;    }    if (treeroot->RightTree) dumptree(treeroot->RightTree,level+1);}idAVLTree::idAVLTree(void) { Root=NULL;}Boolean idAVLTree::IsIn(GateId key){    idAVLTreeNode *tn=Root;    while (tn)    {   if (tn->elem->id == key) return TRUE;        else if (tn->elem->id > key) tn=tn->LeftTree;        else tn=tn->RightTree;    }    return FALSE;}Gate *idAVLTree::Find(GateId key){    idAVLTreeNode *tn=Root;    while (tn)    {   if (tn->elem->id == key) return tn->elem;        else if (tn->elem->id > key) tn=tn->LeftTree;        else tn=tn->RightTree;    }    return NULL;}Boolean idAVLTree::Insert(Gate *elem){    if (!Root)    {   Root=new idAVLTreeNode;        if (Root==NULL) {            printf("Memory Error in AVLTree!!\n");            return FALSE;        }        Root->elem=elem;        Root->bf=0;        Root->LeftTree=Root->RightTree=NULL;        return TRUE;    }    idAVLTreeNode *curr=Root,*currp=NULL,*unbal=Root,*unbalp=NULL;    while (curr)    {   if (curr->bf)        {   unbal=curr;            unbalp=currp;        }        currp=curr;        if (elem->id < curr->elem->id) curr=curr->LeftTree;        else if (elem->id > curr->elem->id) curr=curr->RightTree;        else return FALSE;    }    idAVLTreeNode *y=new idAVLTreeNode;    if (y==NULL) {        printf("Memory Error in AVLTree!!\n");        return FALSE;    }    y->elem=elem;    y->bf=0;    y->LeftTree=y->RightTree=NULL;    if (elem->id < currp->elem->id) currp->LeftTree=y;    else currp->RightTree=y;    if (elem->id < unbal->elem->id)    {   curr=unbal->LeftTree;        (unbal->bf)++;    }    else    {   curr=unbal->RightTree;        (unbal->bf)--;    }    while (curr!=y)    {   if (elem->id < curr->elem->id)        {   curr->bf=1;            curr=curr->LeftTree;        }        else        {   curr->bf=-1;            curr=curr->RightTree;        }    }    if (unbal->bf>1 || unbal->bf<-1) Rebalance(unbal,unbalp);    return TRUE;}Boolean idAVLTree::Delete(GateId key){    Boolean result=FALSE;    if (Root) search_delkey(&result,key,Root,NULL);    return result;}void idAVLTree::DeleteTree(void){    if (Root) deltree(Root);    Root=NULL;}void idAVLTree::Dump(void){    if (Root) dumptree(Root,0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -