首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如何平衡二叉树不能实现(烦了)

2012-03-11 
怎么平衡二叉树不能实现(烦了)#defineLH1#defineEH0#defineRH-1typedefstructBSTNode{intdataintbfstruc

怎么平衡二叉树不能实现(烦了)
#define     LH     1
#define     EH     0
#define     RH     -1

typedef     struct   BSTNode{
                          int     data;
                          int     bf;
                          struct   BSTNode   *lchild;
                          struct   BSTNode   *rchild;
                          }BSTNode,*BSTree;
void     R_Rotate(BSTree   *p)
                {     BSTree   *lc   ;
                      (*lc)=(*p)-> lchild;
                      (*p)-> lchild=(*lc)-> rchild;
                      (*lc)-> rchild=(*p);(*p)=(*lc);
                }

void     L_Rotate(BSTree   *p)
                {     BSTree   *rc   ;
                      (*rc)=(*p)-> rchild;
                      (*p)-> rchild=(*rc)-> lchild;
                      (*rc)-> lchild=(*p);(*p)=(*rc);
                }

int   insertavl(BSTree   *root,int   key,int   taller)
                    {     if(!*root){
                                              *root=(BSTree)malloc(sizeof(BSTNode));(*root)-> data=key;
                                              (*root)-> lchild=(*root)-> rchild=NULL;(*root)-> bf=EH;   taller=1;
                                              }
                          else{
                                  if(key==(*root)-> data)   {   taller=0;   return   0;}
                                  if(key <(*root)-> data)
                                            {     if(!insertavl(&((*root)-> lchild),   key,taller))       return     0;
                                                  if(taller)


                                                            switch((*root)-> bf)
                                                                        {     case   LH:     Leftbalance(&(*root));       taller=0;     break;

                                                                              case   EH:     (*root)-> bf=LH;                     taller=1;     break;

                                                                              case   RH:     (*root)-> bf=EH;                     taller=0;     break;
                                                                          }

                                            }

                                    else{
                                            if(!insertavl(&((*root)-> rchild),   key,taller))             return     0;
                                                  if(taller)
                                                            switch((*root)-> bf)
                                                                        {     case   LH:     (*root)-> bf=EH;                     taller=0;     break;

                                                                              case   EH:     (*root)-> bf=RH;                     taller=1;     break;



                                                                              case   RH:     Rightbalance(&(*root));     taller=0;     break;
                                                                          }

                                              }
                                  }
                          return   1;
                    }

int   Leftbalance(BSTree   *root)
                  {         BSTree   *lc,*rd;
                            (*lc)=(*root)-> lchild;
                            switch((*lc)-> bf)
                                          {   case     LH:     (*root)-> bf=(*lc)-> bf=EH;
                                                                    R_Rotate(&(*root))   ;             break;

                                              case     RH:       (*rd)=(*lc)-> rchild;
                                                                      switch((*rd)-> bf)
                                                                                  {     case     LH:     (*root)-> bf=RH;   (*lc)-> bf=EH;   break;

                                                                                        case     EH:     (*root)-> bf=(*lc)-> bf=EH;           break;

                                                                                        case     RH:     (*root)-> bf=EH;   (*lc)-> bf=LH;   break;


                                                                                  }
                                                                        (*rd)-> bf=EH;
                                                                        L_Rotate(&((*root)-> lchild));
                                                                        R_Rotate(&(*root))   ;         break;
                                          }
                      return   1;
                  }


int     Rightbalance(BSTree   *root)
                  {         BSTree   *rc,*ld;
                            (*rc)=(*root)-> rchild;
                            switch((*rc)-> bf)
                                          {   case     LH:       (*ld)=(*rc)-> lchild;
                                                                      switch((*ld)-> bf)
                                                                                  {     case     LH:     (*root)-> bf=EH;   (*rc)-> bf=RH;   break;

                                                                                        case     EH:     (*root)-> bf=(*rc)-> bf=EH;           break;

                                                                                        case     RH:     (*root)-> bf=LH;   (*rc)-> bf=EH;   break;


                                                                                  }
                                                                        (*ld)-> bf=EH;
                                                                        R_Rotate(&((*root)-> rchild));
                                                                        L_Rotate(&(*root))   ;             break;

                                              case     RH:         (*root)-> bf=(*rc)-> bf=EH;
                                                                        L_Rotate(&(*root))   ;             break;

                                          }
                    return   1;
                  }
void     main()
            {     int   flag,key,m;     int   *k;
                  static   int   taller;
                    clrscr();
                  gotoxy(20,5);     printf( "please   input   a   series   numbers   end   of   ↙: ");
                        scanf( "%d ",&key);
                g=NULL;
                  while(key!=0)
                  {   insertavl(&g,   key,   taller);
                                                scanf( "%d ",&key);
                                                                        }      
                }怎么得出的结果不正确?

------解决方案--------------------


有種技術叫做調試,有種能力叫做Debug
[解决办法]
//在WinTC下一大堆指针未初始化错误
//帮你修改了一下,WinTC编译通过,建议你给指针分配空间

#define LH 1
#define EH 0
#define RH -1
#define NULL (void *)0
typedef struct BSTNode{
int data;
int bf;
struct BSTNode *lchild;
struct BSTNode *rchild;
}BSTNode,*BSTree;
void R_Rotate(BSTree *p)
{ BSTree *lc=NULL ;
(*lc)=(*p)-> lchild;
(*p)-> lchild=(*lc)-> rchild;
(*lc)-> rchild=(*p);(*p)=(*lc);
}

void L_Rotate(BSTree *p)
{ BSTree *rc=NULL ;
(*rc)=(*p)-> rchild;
(*p)-> rchild=(*rc)-> lchild;
(*rc)-> lchild=(*p);(*p)=(*rc);
}

int insertavl(BSTree *root,int key,int taller)
{ if(!*root){
*root=(BSTree)malloc(sizeof(BSTNode));(*root)-> data=key;
(*root)-> lchild=(*root)-> rchild=NULL;(*root)-> bf=EH; taller=1;
}
else{
if(key==(*root)-> data) { taller=0; return 0;}
if(key <(*root)-> data)
{ if(!insertavl(&((*root)-> lchild), key,taller)) return 0;
if(taller)
switch((*root)-> bf)
{ case LH: Leftbalance(&(*root)); taller=0; break;

case EH: (*root)-> bf=LH; taller=1; break;

case RH: (*root)-> bf=EH; taller=0; break;
}

}

else{
if(!insertavl(&((*root)-> rchild), key,taller)) return 0;
if(taller)
switch((*root)-> bf)
{ case LH: (*root)-> bf=EH; taller=0; break;

case EH: (*root)-> bf=RH; taller=1; break;

case RH: Rightbalance(&(*root)); taller=0; break;
}

}
}
return 1;
}

int Leftbalance(BSTree *root)
{ BSTree *lc=NULL,*rd=NULL;
(*lc)=(*root)-> lchild;
switch((*lc)-> bf)
{ case LH: (*root)-> bf=(*lc)-> bf=EH;
R_Rotate(&(*root)) ; break;

case RH: (*rd)=(*lc)-> rchild;
switch((*rd)-> bf)
{ case LH: (*root)-> bf=RH; (*lc)-> bf=EH; break;

case EH: (*root)-> bf=(*lc)-> bf=EH; break;

case RH: (*root)-> bf=EH; (*lc)-> bf=LH; break;
}
(*rd)-> bf=EH;
L_Rotate(&((*root)-> lchild));
R_Rotate(&(*root)) ; break;
}
return 1;
}


int Rightbalance(BSTree *root)
{ BSTree *rc=NULL,*ld=NULL;
(*rc)=(*root)-> rchild;


switch((*rc)-> bf)
{ case LH: (*ld)=(*rc)-> lchild;
switch((*ld)-> bf)
{ case LH: (*root)-> bf=EH; (*rc)-> bf=RH; break;

case EH: (*root)-> bf=(*rc)-> bf=EH; break;

case RH: (*root)-> bf=LH; (*rc)-> bf=EH; break;
}
(*ld)-> bf=EH;
R_Rotate(&((*root)-> rchild));
L_Rotate(&(*root)) ; break;

case RH: (*root)-> bf=(*rc)-> bf=EH;
L_Rotate(&(*root)) ; break;

}
return 1;
}
void main()
{ int flag,key,m;
int *k;
static int taller;
BSTree g;
clrscr();
gotoxy(20,5); printf( "please input a series numbers end of ↙: ");
scanf( "%d ",&key);
g=NULL;
while(key!=0)
{ insertavl(&g, key, taller);
scanf( "%d ",&key);
}
}
[解决办法]
路过!!!
[解决办法]
//平衡二叉树的实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


typedef struct node
{
int data;
int blance;
struct node * left;
struct node * right;
}node_t, * node_tp;


static node_tp avl_tab_p = NULL;


void init_node(node_tp node, int data)
{
if(node)
{
node->data = data;
node->blance = 0;
node->left = NULL;
node->right = NULL;
}
}


void free_tab_s(node_tp node)
{
if(!node)
return;
free_tab_s(node->left);
free_tab_s(node->right);
printf("\nfree data=%d", node->data);
free(node);
}

void free_tab(void)
{
free_tab_s(avl_tab_p);
avl_tab_p = NULL;
}


node_tp find_node(node_tp node, int data)
{
if(!node)
return node;
else if(node->data > data)
return find_node(node->left, data);
else if(node->data < data)
return find_node(node->right, data);
else
return node;
}

int node_depth(node_tp node, int * blance)
{
int l, r;
if(!node)
return 0;
l = node_depth(node->left, blance);
r = node_depth(node->right,blance);
if(blance && (l - r > 1 || l - r < -1))
{
*blance = 0;
printf("\ncha=%d, %d", l-r, node->data);
}
return 1 + ((l > r)? l:r);
}

int travesal_mid_s(node_tp node)
{
int l, r;
if(!node)
return 0;
l = travesal_mid_s(node->left);
printf(" %d(blance=%d depth=%d,) ", node->data, node->blance,node_depth(node,NULL));
r = travesal_mid_s(node->right);
return l + r + 1;
}

void travesal_mid(void)
{
int blance = 1;
int depth = node_depth(avl_tab_p, &blance);
int count;
printf("\n---tree is:--------\n");
count = travesal_mid_s(avl_tab_p);
printf("\n-----count=%d----depth=%d----blance=%d-----------", count, depth, blance);
}

node_tp max_node(node_tp node)


{
if(!node || !node->right)
return node;
return max_node(node->right);
}


node_tp left_rotate(node_tp node)
{
node_tp p = NULL;
if(node && node->right && node->right->right)
{
p = node->right;
node->right = p->left;
p->left = node;

if(p->blance == 0)
{
p->blance = -1;
p->left->blance = 1;
}
else
{
p->blance = 0;
p->left->blance = 0;
}
}
return p;
}

node_tp right_rotate(node_tp node)
{
node_tp p = NULL;
if(node && node->left && node->left->left)
{
p = node->left;
node->left = p->right;
p->right = node;

if(p->blance == 0)
{
p->blance = 1;
p->right->blance = -1;
}
else
{
p->blance = 0;
p->right->blance = 0;
}

}
return p;
}

node_tp left_right_rotate(node_tp node)
{
node_tp p = NULL;
if(node && node->left && node->left->right)
{
p = node->left->right;
node->left->right = p->left;
p->left = node->left;

node->left = p->right;
p->right = node;

switch(p->blance)
{
case -1:
p->left->blance = p->blance = 0;
p->right->blance = 1;
break;
case 0:
p->left->blance = p->right->blance = p->blance = 0;
break;
case 1:
p->left->blance = -1;
p->blance = p->right->blance = 0;
break;
default:
break;
}

}
return p;
}


node_tp right_left_rotate(node_tp node)
{
node_tp p = NULL;
if(node && node->right && node->right->left)
{
p = node->right->left;
node->right->left = p->right;
p->right = node->right;

node->right = p->left;
p->left = node;

switch(p->blance)
{
case -1:
p->left->blance = p->blance = 0;
p->right->blance = 1;
break;
case 0:
p->blance = p->left->blance = p->right->blance = 0;
break;
case 1:
p->blance = p->right->blance = 0;
p->left->blance = -1;
break;
default:
break;
}
}
return p;
}

[解决办法]
路过 头晕 帮顶

热点排行