平衡二叉树的一点困惑

困惑:对于LR型(在左子树的右子树插入后不平衡)的bf的计算。

/*  对以指针T所指结点为根的二叉树作左平衡旋转处理 */  
    52. /*  本算法结束时,指针T指向新的根结点 */  
    53. void LeftBalance(BiTree *T)  
    54. {   
    55.     BiTree L,Lr;  
    56.     L=(*T)->lchild; /*  L指向T的左子树根结点 */   
    57.     switch(L->bf)  
    58.     { /*  检查T的左子树的平衡度,并作相应平衡处理 */   
    59.          case LH: /*  新结点插入在T的左孩子的左子树上,要作单右旋处理 */   
    60.             (*T)->bf=L->bf=EH;  
    61.             R_Rotate(T);  
    62.             break;  
    63.          case RH: /*  新结点插入在T的左孩子的右子树上,要作双旋处理 */   
    64.             Lr=L->rchild; /*  Lr指向T的左孩子的右子树根 */   
    65.             switch(Lr->bf)  
    66.             { /*  修改T及其左孩子的平衡因子 */   
    67.                 case LH: (*T)->bf=RH;  
    68.                          L->bf=EH;  
    69.                          break;  
    70.                 case EH: (*T)->bf=L->bf=EH;  //**困惑在这里**
    71.                          break;  
    72.                 case RH: (*T)->bf=EH;  
    73.                          L->bf=LH;  
    74.                          break;  
    75.             }  
    76.             Lr->bf=EH;  
    77.             L_Rotate(&(*T)->lchild); /*  对T的左子树作左旋平衡处理 */   
    78.             R_Rotate(T); /*  对T作右旋平衡处理 */   
    79.     }  
    80. }  

对应于上面第70行:为什么Lr会有EH这种情况?在插入新元素之前,它就已经造成了二叉树的不平衡,那提前为什么不调整,为什么要等插入平衡之后再调整?
其实,没考虑周全,思维定式地以为插入之后平衡,就一定是已经有左孩子或右孩子。那么:

这种情况就是属于Lr=EH的情况。即原来Lr就不存在,插入的新元素就是Lr自己,没有孩子它自身当然是平衡的。但此时二叉树不平衡了。

猜你喜欢

转载自blog.csdn.net/CY05627/article/details/84501488