自己动手实现数据结构——AVL树(C++实现)

这类教程有很多了,就用C++简单实现下以供记录和参考,以后再有补充版本。

实现了查找和插入、删除操作有些复杂,感觉个人实现的效率不是很高,以后再补充,先把做过的东西记录下来。

Avl.h

#ifndef __AVL_H
#define __AVL_H

#include<stddef.h>
#include<vector>

template< class T>
struct AvlNode{
    T data;
    int height;
    AvlNode* left;
    AvlNode* right;
    AvlNode(T value):data(value),left(NULL),right(NULL),height(1){};
};

template< class T >
class AvlTree{
    public:
        AvlTree():pTree(NULL){};
        ~AvlTree();
        int height(AvlNode<T>* node)const;
        int max_height(int a, int b);

        //order
        void PreOrderTree(AvlNode<T>* tree)const;
        void InOrderTree(AvlNode<T>* tree)const;
        void PostOrderTree(AvlNode<T>* tree)const;

        // rotate
        void SingleRotateL(AvlNode<T>* &parent);
        void SingleRotateR(AvlNode<T>* &parent);
        void DoubleRotateLR(AvlNode<T>* &parent);
        void DoubleRotateRL(AvlNode<T>* &parent);

        // find
        void find_min(AvlNode<T>* node);
        void find_max(AvlNode<T>* node);

        // insert
        void insert(AvlNode<T>* &root, T value);
        AvlNode<T>* pTree;
};

#endif

Avl.cc

#include "Avl.h"
#include <iostream>
#include <cmath>
using namespace std;

template< class T>
void AvlTree<T>::insert(AvlNode<T>* &root, T value){
    if ( NULL == root)
    {
        root = new AvlNode<T>( value );
        if ( NULL == root )
        {
            cout << "init failed"<<endl;
        }
    }
    else if ( value < root-> data ){
        insert( root-> left, value );
        if ( 2 == height(root->left) - height(root->right))
        {
            if ( value < root->left->data )
                SingleRotateR( root);
            else
                DoubleRotateLR(root);
        }
    }
    else{
        insert(root->right, value );
        if( 2 == height(root->right) - height(root->left) ){
            if ( value < root->right->data )
                DoubleRotateRL(root);
            else
                SingleRotateL(root);
        }
    }
    root->height = max_height(height(root->left), height(root->right)) + 1;
}

template< class T>
void AvlTree<T>::SingleRotateR( AvlNode<T>* &parent){
    AvlNode<T>* child = parent->left;
    parent->left = child->right;
    child->right = parent;
    parent->height = max_height(height(parent->left), height(parent->right))+1;
    child->height = max_height(height(child->left), height(child->right))+1;
    parent = child;
}

template< class T>
void AvlTree<T>::SingleRotateL( AvlNode<T>* &parent){
    AvlNode<T>* child = parent->right;
    parent->right = child->left;
    child->left = parent;
    parent->height = max_height(height(parent->left), height(parent->right))+1;
    child->height = max_height(height(child->left), height(child->right))+1;
    parent = child;
}

template< class T >
void AvlTree<T>::DoubleRotateLR( AvlNode<T>* &parent ){
    SingleRotateL( parent -> left );
    SingleRotateR( parent );
}

template< class T >
void AvlTree<T>::DoubleRotateRL( AvlNode<T>* &parent ){
    SingleRotateR( parent -> right);
    SingleRotateL( parent );
}

template<class T>
int AvlTree<T>::height(AvlNode<T>* node) const{
    if ( NULL == node )
        return 0;
    else
        return node->height;
}

template<class T>
int AvlTree<T>::max_height(int a, int b){
    return a > b ? a:b;
}

template<class T>
void AvlTree<T>::PreOrderTree(AvlNode<T>* tree)const{
    if ( NULL != tree){
        cout << tree->data <<" ";
        PreOrderTree(tree->left);
        PreOrderTree(tree->right);
    }
}

template<class T>
void AvlTree<T>::InOrderTree(AvlNode<T>* tree)const{
    if ( NULL != tree ){
        InOrderTree(tree->left);
        cout << tree->data <<" ";
        InOrderTree(tree->right);
    }
}

template<class T>
void AvlTree<T>::PostOrderTree(AvlNode<T>* tree)const{
    if ( NULL != tree ){
        PostOrderTree(tree->left);
        PostOrderTree(tree->right);
        cout << tree->data <<" ";
    }
}

int main(void){
    int input;
    int size;
    int i = 0;
    AvlTree<int>* tree = new AvlTree<int>();
    cout << " input the size" <<endl;
    cin >> size;
    cout << " input the value" <<endl;
    while ( i < size )
    {
        cin >> input;
        tree->insert( tree->pTree, input);
        ++i;
    }

    tree->PreOrderTree(tree->pTree);
    cout<<endl;
    tree->InOrderTree(tree->pTree);
    cout<<endl;
    tree->PostOrderTree(tree->pTree);

    return 0;
}

测试:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 09:39:10

自己动手实现数据结构——AVL树(C++实现)的相关文章

数据结构--AVL树

AVL树是高度平衡的二叉搜索树,较搜索树而言降低了树的高度:时间复杂度减少了使其搜索起来更方便: 1.性质: (1)左子树和右子树高度之差绝对值不超过1: (2)树中每个左子树和右子树都必须为AVL树: (3)每一个节点都有一个平衡因子(-1,0,1:右子树-左子树) (4)遍历一个二叉搜索树可以得到一个递增的有序序列 2.结构: 平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进.二叉搜索树有一个缺点就是,树的结构是无法预料的.任意性非常大.它仅仅与节点的值和插入的顺序有关系.往往得到的是

数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树). 对Avl树进行相关的操作最重要的是要保持Avl树的平衡条件.即对Avl树进行相关的操作后,要进行相应的旋转操作来恢复Avl树的平衡条件. 对Avl树的插入和删除都可以用递归实现,文中也给出了插入的非递归版本,关键在于要用到栈. 代码如下: #inclu

简单数据结构———AVL树

C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2193 Description An AVL tree is a kind of balanced binary search tree. Named after their invento

数据结构&amp;&amp;AVL树原理、插入操作详解及实现

1.基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级--它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 2.AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1. 本身首先是一棵二叉搜索树. 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5              5 / \            / \ 2   6          2  

[数据结构] AVL树和AVL旋转、哈夫曼树和哈夫曼编码

1. AVL树 AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子1.0或 -1的节点被认为是平衡的.带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树.平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来. 1.2AVL旋转 AVL树的基本操作一

数据结构--AVL树的insert()的Java实现

一个AVL树是其每个节点的左子树和右子树的高度差最多差1的二叉查找树:AVL树是一种最古老的平衡查找树 上代码: package com.itany.avlshu; public class AVLTree<T extends Comparable<?super T>> { private static class AvlNode<T> { private int height; private T element; private AvlNode<T> l

JAVA数据结构--AVL树的实现

AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文<An algorithm for the organization of information>中发表了它. 节点的平衡因子是

再回首数据结构—AVL树(二)

前面主要介绍了AVL的基本概念与结构,下面开始详细介绍AVL的实现细节: AVL树实现的关键点 AVL树与二叉搜索树结构类似,但又有些细微的区别,从上面AVL树的介绍我们知道它需要维护其左右节点平衡,实现AVL树关键在于标注节点高度.计算平衡因子.维护左右子树平衡这三点,下面分别介绍: 标注节点高度 从上面AVL树的定义中我们知道AVL树其左右节点高度差不能超过一,所以我们需要标注出每个节点高度: 1.节点高度为最大的子节点高度加1,其中叶子节点高度为1: 2.1与4叶子节点高度为1,节点3高度

B树、B+树、红黑树、AVL树

定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2.除根结点以外的非叶子结点的儿子数为 M/2(向上取整) ~ M3.拥有 K 个孩子的非叶子节点包含 k-1 个keys(关键字),且递增排列4.所有叶子结点在同一层,即深度相同 (叶节点可以看成是一种外部节点,不包含任何关键字信息) 在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶