SDUT数据结构实验之查找二:平衡二叉树

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct BSTNode// 结点
{
    int data;// 数据域
    int bf;// 平衡因子
    struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;

BSTree init(int data)
{
    BSTree T = (BSTree)malloc(sizeof(BSTNode));
    T->data = data;
    T->bf = 0;
    T->lchild = NULL;
    T->rchild = NULL;

    return T;
}

BSTree rotateL(BSTree T)
{
    BSTree tmp = T->rchild;
    T->rchild = tmp->lchild;
    tmp->lchild = T;
    return tmp;
}

BSTree rotateR(BSTree T)
{
    BSTree tmp = T->lchild;
    T->lchild = tmp->rchild;
    tmp->rchild = T;
    return tmp;
}

BSTree LeftBalance(BSTree T)
{

    if(T->lchild->bf == 1) // 添加到左子树的左面 LL
    {
        T->bf = T->lchild->bf = 0;
        T = rotateR(T);

    }
    else if(T->lchild->bf == -1) // 添加到 左子树的右面 LR
    {
        switch(T->lchild->rchild->bf)
        {
            case 1:T->lchild->bf = 0;T->bf = 1;break;
            case -1:T->bf = 0;T->lchild->bf = 1;break;
            case 0:T->bf = 0 ; T->lchild->bf = 0;break;
        }
        T->lchild->rchild->bf = 0;

        T->lchild = rotateL(T->lchild);
        T = rotateR(T);
    }

    return T;
}
BSTree RightBalance(BSTree T)
{
    if(T->rchild->bf == 1)
    {
        switch (T->rchild->lchild->bf)
        {
            case 1:T->bf = 0;T->rchild->bf = -1;break;
            case 0:T->bf = 0; T->rchild->bf = 0;break;
            case -1:T->bf = 1;T->rchild->bf = 0;break;
        }
        T->rchild->lchild->bf = 0;

        T->rchild = rotateR(T->rchild);
        T = rotateL(T);

    }
    else if(T->rchild->bf == -1)
    {
        T->bf = 0;
        T->rchild->bf = 0;
        T = rotateL(T);
    }

    return T;
}

BSTree insert(BSTree T, int data, int* taller)
{
    if(T == NULL)
    {
        T = init(data);
        *taller  = 1;

        return T;
    }
    else if(T->data == data)
    {
        *taller  = 0;
        return T;
    }
    else if(data <T->data)
    {
        T->lchild = insert(T->lchild, data, taller);
        if(*taller)
        {
            switch(T->bf)
            {
                case 1:T = LeftBalance(T);*taller = 0;break;//
                case 0:T->bf = 1;*taller = 1;break;// 如果父节点平衡节点为0 表示左右等高  如果在左面插入导致书增高 该节点的平衡因子发生改变
                case -1:T->bf = 0;*taller = 0;break;//如果在左面插入结点 如果父结点bf 为-1, 那么左右子树等高  平衡因子变为0  树没增高
            }
        }
    }
    else if(data >T->data)
    {
        T->rchild = insert(T->rchild, data, taller);
        if(*taller)
        {
            switch(T->bf)
            {
                case 1:T->bf = 0;*taller = 0;break;
                case 0:T->bf = -1;*taller = 1;break;
                case -1:T = RightBalance(T);*taller = 0;break;
            }
        }
    }

    return T;
}


BSTree create(int N)
{
    BSTree T = NULL;
    int i;

    for(i = 0;i < N;i++)
    {
        int num;
        scanf("%d", &num);
        int a = 0;
        int*taller = &a;
        T = insert(T, num, taller);
    }

    return T;
}

int main()
{
    int N;
    scanf("%d", &N);

    BSTree root = NULL;
    root = create(N);
    printf("%d", root->data);

    return 0;
}



/****
这个比较简单
但是每次求高度耗时高
****/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
    int data;
    struct node *left, *right;
}node, *Node;

Node init(int data)
{
    Node tmp = (Node)malloc(sizeof(struct node));
    tmp->left = NULL;
    tmp->right = NULL;
    tmp->data = data;

    return tmp;
}

Node LL(Node T)
{
    Node tmp = T->left;

    T->left = tmp->right;
    tmp->right = T;

    return tmp;
}

Node RR(Node T)
{
    Node tmp = T->right;
    T->right = tmp->left;
    tmp->left = T;
    return tmp;
}

Node LR(Node T)
{
    T->left= RR(T->left);
    T = LL(T);
    return T;
}

Node RL(Node T)
{
    T->right = LL(T->right);
    T = RR(T);
    return T;
}
int max(int x, int y)
{
    return x>y?x:y;
}

int height(Node T)
{
    if(T == NULL)return 0;
    else return max(height(T->left), height(T->right))+1;
}

Node insert(Node T, int data, int* flag)
{

    if(T == NULL)
    {
        T = init(data);
        return T;
    }
    else if(data < T->data)
    {
        *flag = 1;
        T->left = insert(T->left, data, flag);
        int hl,hr;
        hl = height(T->left);
        hr = height(T->right);

        if(abs(hl-hr) >= 2)
        {
            if(data < T->left->data) return LL(T);
            else return LR(T);
        }

    }
    else if(data > T->data)
    {
        *flag = 2;
        T->right = insert(T->right, data, flag);
        int hl,hr;
        hl = height(T->left);
        hr = height(T->right);

        if(abs(hl-hr) >= 2)
        {
            if(data < T->right->data)return RL(T);
            else return RR(T);
        }
    }


    return T;
}



Node create(int N)
{
    Node T = NULL;
    int i;
    for(i = 0;i < N;i++)
    {
        int num;
        scanf("%d", &num);
        int flag = 0;
        T = insert(T, num, &flag);
    }

    return T;
}

int main()
{
    int N;
    scanf("%d", &N);

    Node root = NULL;
    root = create(N);
    if(root)printf("%d", root->data);

    return 0;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值