困惑:对于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自己,没有孩子它自身当然是平衡的。但此时二叉树不平衡了。