Geeks - AVL Tree Insertion 平衡二叉树

AVL可以保证搜索达到O(lgn)的时间效率,因为两边的树高都差不多。不会出现搜索是线性的最坏情况。

但是AVL在插入和删除节点的时候需要做较多的旋转操作,所以如果修改节点多的时候,最好使用红黑树,但是如果搜索多的时候,就最好使用AVL了。

参考:http://www.geeksforgeeks.org/avl-tree-set-1-insertion/

注意点:

1 判断关键字和节点的孩子节点的大小判断应该是左转还是右转

2 利用递归就不需要记录父母节点了

3 注意更新balance和判断balance的顺序

#pragma once
#include <stdio.h>
#include <algorithm>

using std::max;

class AVL
{
	struct Node
	{
		int key;
		Node *left, *right;
		int h;
		Node(int k) : key(k)
		{
			left = right = NULL;
			h = 1;
		}
		~Node()
		{
			if (left) delete left;
			if (right) delete right;
		}
	};

	inline int getHeight(Node *n)
	{
		if (!n) return 0;
		return n->h;
	}

	inline void updateHeight(Node *y)
	{
		y->h = max(getHeight(y->left), getHeight(y->right)) + 1;
	}

	Node *rightRotate(Node *y)
	{
		Node *x = y->left;
		y->left = x->right;
		x->right = y;

		updateHeight(y);
		updateHeight(x);

		return x;
	}

	Node *leftRotate(Node *y)
	{
		Node *x = y->right;
		y->right = x->left;
		x->left = y;

		updateHeight(y);
		updateHeight(x);

		return x;
	}

	inline int getBalance(Node *n)
	{
		if (!n) return 0;
		return getHeight(n->left) - getHeight(n->right);
	}

	Node *insert(Node *node, int key)
	{
		if (!node) return new Node(key);

		if (key < node->key) node->left = insert(node->left, key);
		else node->right = insert(node->right, key);

		updateHeight(node);

		int balance = getBalance(node);

		if (balance > 1 && key < node->left->key)
			return rightRotate(node);

		else if (balance < -1 && node->right->key < key)
			return leftRotate(node);

		else if (balance > 1 && node->left->key < key)
		{
			node->left = leftRotate(node->left);
			return rightRotate(node);
		}

		else if (balance < -1 && key < node->right->key)
		{
			node->right = rightRotate(node->right);
			return leftRotate(node);
		}

		//unchanged node pointer
		return node;
	}

	void preOrder(Node *root)
	{
		if(root != NULL)
		{
			printf("%d ", root->key);
			preOrder(root->left);
			preOrder(root->right);
		}
	}
public:
	AVL()
	{
		Node *root = NULL;

		/* Constructing tree given in the above figure */
		root = insert(root, 10);
		root = insert(root, 20);
		root = insert(root, 30);
		root = insert(root, 40);
		root = insert(root, 50);
		root = insert(root, 25);

		/* The constructed AVL Tree would be
		30
		/  		20   40
		/  \     		10  25    50
		*/

		printf("Pre order traversal of the constructed AVL tree is \n");
		preOrder(root);
	}
};

Geeks - AVL Tree Insertion 平衡二叉树

时间: 2024-11-10 11:20:22

Geeks - AVL Tree Insertion 平衡二叉树的相关文章

Geeks - AVL Tree Deletion 平衡二叉树 删除操作

在工作中的经常使用repo命令,但是有时会忘记一些命令和遇到的一些问题,记录下来方便已经查询. 常见问题: 问题1:找不到命令:repo 方法: 在下载android源码的时候用repo时提示找不到命令,可以用如下方法解决,在命令行中输入如下两行: echo 'export PATH=$PATH:$Home/bin' >>~/.bashrc export PATH=$PATH:$HOME/bin 问题2: /home/xxxxxx/bin/repo: line 1: 在未预料的"ne

平衡二叉树(AVL Tree)

在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树. (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过程,但是还是需要注意,所以还请读者忽略一下部分图的箭头) 一.二叉(查找)树 二叉查找树(Binary Search Tree)是二叉树的一种,其树节点(internal nodes of the tree)储存着键值并且满足以下特性并如图A所示: 假设u, v, r分别为树的三个结点(nodes)

PAT 甲级 1066 Root of AVL Tree (25 分)(快速掌握平衡二叉树的旋转,内含代码和注解)***

1066 Root of AVL Tree (25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this

Geeks Splay Tree Insert 树的插入操作

Splay树的插入操作,只需要处理好插入节点的孩子节点就可以了,最重要的是不要破坏了BST的基本规则. 因为高度并不是Splay树的首要因素,所以插入的时候也是使用splay操作,然后在根节点插入. 参考:http://www.geeksforgeeks.org/splay-tree-set-2-insert-delete/ 对比一下使用插入创建的树和手工创建数的区别,先序遍历的结果: #pragma once #include<stdio.h> #include <stdlib.h&g

PAT1066. Root of AVL Tree

An AVL tree is a self-balancing binary search tree.  In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property.  Figures 1-4 illu

pat04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any tim

04-1. Root of AVL Tree (PAT)

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illust

树的平衡 AVL Tree

本篇随笔主要从以下三个方面介绍树的平衡: 1):BST不平衡问题 2):BST 旋转 3):AVL Tree 一:BST不平衡问题的解析 之前有提过普通BST的一些一些缺点,例如BST的高度是介于lgN和N之间的,如果是N的的话,显然效率很低,不是我们需要的:但是在实际情况中,BST的高度h = N的情况却经常出现,例如下图所示.在BST中search,insert的running time都等于BST的高度h,我们肯定希望高度h越小越好,best case就是lgN.下图的example 2的

BST, AVL Tree 和 Splay Tree 的实现

一.定义. 1.1 BST 二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: ① 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: ② 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: ③ 任意节点的左.右子树也分别为二叉查找树. ④ 没有键值相等的节点. 1.2 AVL Tree 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子