zoukankan      html  css  js  c++  java
  • 二叉平衡树

    性质

    • 对于AVL树的任意节点来说,左子树和右子树的高度之差的绝对值不超过1

    二叉平衡树

    //二叉平衡树
    struct node
    {
    	int data, height;
    	node* left;
    	node* right;
    };
    

    生成一个新节点

    //生成一个新节点
    node* newNode(int data)
    {
    	node* root = new node;
    	root->data = data;
    	root->left = root->right = NULL;
    	root->height = 1;
    	return root;
    }
    

    获取root的高度

    //获取root的高度
    int getHeight(node* root)
    {
    	if (root == NULL)
    		return 0;
    	return root->height;
    }
    

    计算结点的平衡因子

    //计算结点的平衡因子
    int getBalance(node* root)
    {
    	if (root != NULL)
    		return getHeight(root->left) - getHeight(root->right);
    	return 0;
    }
    

    更新高度

    void updateHeight(node* root)
    {
    	root->height = max(getHeight(root->left), getHeight(root->right)) + 1;
    }
    

    二叉平衡树的查找

    //二叉平衡树的查找
    void search(node* root,int v)
    {
    	if (root == NULL)
    	{
    		//查找失败
    		printf("查找失败
    ");
    		return;
    	}
    	if (root->data == v)
    	{
    		//找到了
    		printf("查找成功
    ");
    		return;
    	}
    	else if (root->data > v)
    	{
    		//左边找
    		search(root->left, v);
    	}
    	else 
    	{
    		//右边找
    		search(root->right, v);
    	}
    }
    

    左旋

    //左旋
    void L(node* &root)
    {
    	//获得root的右孩子
    	node* r = root->right;
    	if (r != NULL)
    	{
    		//root的右孩子变为r的左孩子
    		root->right = r->left;
    		//r的左孩子变为root
    		r->left = root;
    		updateHeight(root);
    		updateHeight(r);
    		root = r;
    	}
    }
    

    右旋

    //右旋
    void R(node*& root)
    {
    	//获得root的左孩子
    	node* l = root->left;
    	if (l != NULL)
    	{
    		//root的左孩子变为r的右孩子
    		root->left = l->right;
    		//r的左孩子变为root
    		l->right = root;
    		updateHeight(root);
    		updateHeight(l);
    		root =l;
    	}
    }
    

    插入

    //插入
    void insert(node*& root, int v)
    {
    	if (root == NULL)
    	{
    		root = newNode(v);
    		return;
    	}
    	if (v < root->data)
    	{
    		//插在左边
    		insert(root->left, v);
    		updateHeight(root);
    		if (getBalance(root) == 2)
    		{
    			if (getBalance(root->left) == 1)//LL
    			{
    				//进行一次左旋
    				L(root);
    			}
    			else if (getBalance(root->left) == -1)//LR
    			{
    				//进行一次左旋
    				L(root->left);
    				//进行一次右旋
    				R(root);
    			}
    		}
    	}
    	else 
    	{
    		//插在右边
    		insert(root->right, v);
    		updateHeight(root);
    		if (getBalance(root) == -2)
    		{
    			if (getBalance(root->right) == 1) //RL
    			{
    				//先右旋
    				R(root->right);
    				//再左旋
    				L(root);
    			}
    			else if (getBalance(root->right) == -1)//RR
    			{
    				R(root);
    			}
    		}
    	}
    }
    

    AVL的建立

    //AVL的建立
    node* Create(int data[],int n)
    {
    	node* root = NULL;
    	for (int i = 0; i < n; i++)
    	{
    		insert(root, data[i]);
    	}
    	return root;
    }
    
  • 相关阅读:
    ubuntu20.04安装教程TLS,ubuntu安装教程20.04
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu20.04图文安装教程
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu安装教程20.04
    ubuntu19.10安装搜狗输入法,ubuntu19.10安装中文输入法
    ubuntu20.04安装搜狗输入法,ubunru安装搜狗输入法中文输入法拼音
    前端实现实时通讯
    移动端1px边框的实现
    利用js自动触发一个a标签的下载事件
  • 原文地址:https://www.cnblogs.com/code-fun/p/15228086.html
Copyright © 2011-2022 走看看