高度平衡二叉树的构建_构建平衡二叉树

选取一组数来构建平衡二叉树,数组为[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。

3c77feba01feb98043dea16e4dc1dce5.png

图1 LL型旋转(ll_rotate)

接着插入4,是平衡的,再插入5,此时出现了不平衡,结点 2 和 3 的平衡因子都为 -2,结点3为最低不平衡结点,属于RR型,调整过程如图2所示。

0ce7222d2dd32ec7b0b5f986cb4a92a4.png

图2 RR型旋转(rr_rotate)

接着插入6,此时结点 2 的平衡因子为 -2,导致不平衡,结点2为最低不平衡结点,属于RR型,调整如图3所示。

368a5ccfb15df7ee01c3618663d7924a.png

图3 RR型旋转(rr_rotate)

接着插入7,此时结点5的平衡因子为 -2,导致不平衡,结点5为最低不平衡结点,属于RR型,调整如图4所示。

69d08a364a4ec9f97f1842fc83674b23.png

图4 RR型旋转(rr_rotate)

接着插入10,是平衡的,再插入9,此时结点 4、6、7 的平衡因子都为 -2,导致不平衡,结点7为最低不平衡结点,属于RL型,调整如图5所示。

d84618032d2a5a58a57bc053e9cca4f1.png

图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所示。

3a40acc1c9d65b35a4b5618934593080.png

图6 RL型旋转

最终构建得到的平衡二叉树为:

d5469c2c06e9b9d87a29510175d3c178.png

构建得到的平衡二叉树

源代码如下:

#include#include 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;}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值