選取一組數來構建平衡二叉樹,陣列為[3,2,1,4,5,6,7,10,9,8]
BTNode root = NULL; root = insert(root, 3); root = insert(root, 2); root = insert(root, 1); root = insert(root, 4); root = insert(root, 5); root = insert(root, 6); root = insert(root, 7); root = insert(root, 10); root = insert(root, 9); root = insert(root, 8); printf("midOrder:"); midOrder(root);//輸出為:midOrder:1 2 3 4 5 6 7 8 9 10
ALV平衡二叉樹的結點定義如下,注意結點中包含結點高度資訊,方便儲存結點高度,有利於快速根據平衡因子(PF)判斷是否平衡。
typedef struct Node{ int _data; struct Node *_left; struct Node *_right; int _nodeHeight;//結點高度}*BTNode;
構建ALV平衡二叉樹的具體過程:
首先資料為3的結點作為根結點插入,接著插入2,仍是平衡的,再插入1時,3的平衡因子變為2,此時出現了不平衡,因此需要進行調整,最低不平衡結點為3,屬於LL型,調整過程如圖1所示。圖1 LL型調整完之後,繼續插入了結點4,結點5。
圖1 LL型旋轉(ll_rotate)
接著插入4,是平衡的,再插入5,此時出現了不平衡,結點 2 和 3 的平衡因子都為 -2,結點3為最低不平衡結點,屬於RR型,調整過程如圖2所示。
圖2 RR型旋轉(rr_rotate)
接著插入6,此時結點 2 的平衡因子為 -2,導致不平衡,結點2為最低不平衡結點,屬於RR型,調整如圖3所示。
圖3 RR型旋轉(rr_rotate)
接著插入7,此時結點5的平衡因子為 -2,導致不平衡,結點5為最低不平衡結點,屬於RR型,調整如圖4所示。
圖4 RR型旋轉(rr_rotate)
接著插入10,是平衡的,再插入9,此時結點 4、6、7 的平衡因子都為 -2,導致不平衡,結點7為最低不平衡結點,屬於RL型,調整如圖5所示。
圖5 RL型旋轉
if (pf < -1 && data < node->_right->_data) //RL型 { node->_right = ll_rotate(node->_right); return rr_rotate(node); }
插入8,此時結點4、6的平衡因子為 -2,導致不平衡,最低不平衡結點為6,屬於RL型,調整如圖6所示。
圖6 RL型旋轉
最終構建得到的平衡二叉樹為:
構建得到的平衡二叉樹
原始碼如下:
#include<stdio.h>#include<stdlib.h> typedef struct Node{ int _data; struct Node *_left; struct Node *_right; int _nodeHeight;}*BTNode; int max(int a, int b); int getHeight(struct Node *node){ if (node == NULL) return 0; return node->_nodeHeight;} int max(int a, int b){ return (a > b) ? a : b;} BTNode newNode(int data){ BTNode node = (BTNode)malloc(sizeof(struct Node)); node->_data = data; node->_left = NULL; node->_right = NULL; node->_nodeHeight = 1; return(node);} BTNode ll_rotate(BTNode y){ BTNode x = y->_left; y->_left = x->_right; x->_right = y; y->_nodeHeight = max(getHeight(y->_left), getHeight(y->_right)) + 1; x->_nodeHeight = max(getHeight(x->_left), getHeight(x->_right)) + 1; return x;} BTNode rr_rotate(BTNode y){ BTNode x = y->_right; y->_right = x->_left; x->_left = y; y->_nodeHeight = max(getHeight(y->_left), getHeight(y->_right)) + 1; x->_nodeHeight = max(getHeight(x->_left), getHeight(x->_right)) + 1; return x;} int getBalance(BTNode node){ if (node == NULL) return 0; return getHeight(node->_left) - getHeight(node->_right);} BTNode insert(BTNode node, int data){ if (node == NULL) return newNode(data); if (data < node->_data) node->_left = insert(node->_left, data); else if (data > node->_data) node->_right = insert(node->_right, data); else return node; node->_nodeHeight = 1 + max(getHeight(node->_left), getHeight(node->_right)); int pf = getBalance(node); if (pf > 1 && data < node->_left->_data) //LL型 return ll_rotate(node); if (pf < -1 && data > node->_right->_data) //RR型 return rr_rotate(node); if (pf > 1 && data > node->_left->_data) //LR型 { node->_left = rr_rotate(node->_left); return ll_rotate(node); } if (pf < -1 && data < node->_right->_data) //RL型 { node->_right = ll_rotate(node->_right); return rr_rotate(node); } return node;} void midOrder(struct Node *root){ if (root != NULL) { midOrder(root->_left); printf("%d ", root->_data); midOrder(root->_right); }} int main(){ BTNode root = NULL; root = insert(root, 3); root = insert(root, 2); root = insert(root, 1); root = insert(root, 4); root = insert(root, 5); root = insert(root, 6); root = insert(root, 7); root = insert(root, 10); root = insert(root, 9); root = insert(root, 8); printf("midOrder:"); midOrder(root); return 0;}
最新評論