zoukankan      html  css  js  c++  java
  • 搭建AVL树

    #include<iostream>
    using namespace std;
    
    struct TreeNode
    {
        int height;   //每一个结点都要保存自己的高度
        int data;
        TreeNode* leftC;
        TreeNode* rightC;
    };
    
    //得到此时结点高度
    int getHeight(TreeNode* s)
    {
        if (s != NULL)
        {
            return s->height;
        }
        return -1;
    }
    
    //右旋
    void rightRotate(TreeNode*& root)
    {
        TreeNode *l1 = root;
        TreeNode *l2 = root->leftC;
        l1->leftC = l2->rightC;
        l2->rightC = l1;
        l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1;
        l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1;
        root = l2;
    }
    
    //左旋
    void leftRotate(TreeNode*& root)
    {
        TreeNode *l1 = root;
        TreeNode *l2 = root->rightC;
        l1->rightC = l2->leftC;
        l2->leftC = l1;
        l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1;
        l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1;
        root = l2;
    }
    
    //左右,先左旋,再右旋
    void DoubleRotateLR(TreeNode* &n1)
    {
        leftRotate(n1->leftC);
        rightRotate(n1);
    }
    
    //右左,先右旋,后左旋
    void DoubleRotateRL(TreeNode* &n1)
    {
        rightRotate(n1->rightC);
        leftRotate(n1);
    }
    
    
    void Insert(TreeNode** node, int data)
    {
        if (*node == NULL)
        {
            TreeNode* tmp = new TreeNode();
            tmp->data = data;
            tmp->height = 0;
            tmp->leftC = NULL;
            tmp->rightC = NULL;
            *node = tmp;
            return;
        }
        if ((*node)->data > data)//结点的值大于data
        {
            Insert(&((*node)->leftC), data);//不断插入
    
            if ((getHeight((*node)->leftC) - getHeight((*node)->rightC)) == 2)
            {//说明需要右旋
                if (data < (*node)->leftC->data)
                {
                    rightRotate(*node);
                }
                else
                {
                    DoubleRotateLR(*node);
                }
            }
    
        }
        else if ((*node)->data < data)//没有相同的值
        {
            Insert(&((*node)->rightC), data);
            //如果高度之差为2的话就失去了平衡,需要旋转
            if (2 == getHeight((*node)->rightC) - getHeight((*node)->leftC))
            {
                if (data > (*node)->rightC->data)
                {
                    leftRotate(*node);
                }
                else
                {
                    DoubleRotateRL(*node);
                }
            }
        }
        
        (*node)->height = (getHeight((*node)->leftC) > getHeight((*node)->rightC) ? getHeight((*node)->leftC) : getHeight((*node)->rightC)) + 1;
    }
    
    void preOrder(TreeNode* node)
    {
        if (node == NULL)
        {
            return;
        }
        cout << node->data << " ";
        preOrder(node->leftC);
        preOrder(node->rightC);
    }
    
    void  inOrderTraversal(TreeNode* root)
    {
        if(root)
        {
        	inOrderTraversal(root->leftC);
        	cout << root->data << " ";
        	inOrderTraversal(root->rightC);
        }
    }
    
    int main()
    {
    	int n;
    	cin>>n;
    	while(n-->0)
    	{
    	    int num;
    	    cin>>num;
    
    	    TreeNode *head=NULL;
    
            int point;
    
            for(int i=0;i<num;i++)
            {
                cin>>point;
                Insert(&head, point);
            }
    
            preOrder(head);
            cout<<endl;
            inOrderTraversal(head);
            cout<<endl;
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    Monggodb基础
    手游运营数据指标
    JSON语法
    Java中日期转换问题
    Java线程中锁的问题
    鼠标移动监听的注意事项
    链接数据库的问题
    获取显示器的宽高
    JTable的使用问题
    JScrollPane控件中添加其他控件的问题&&JScrollPane设置滚动条&&调整滚动速度
  • 原文地址:https://www.cnblogs.com/KennyRom/p/6209488.html
Copyright © 2011-2022 走看看