首頁>技術>

選取一組數來構建平衡二叉樹,陣列為[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;}

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 某站上百萬播放量2000分鐘的Java多執行緒與高併發程式設計全集