自己动手实现数据结构——AVL树(C++实现)
来源:互联网 发布:php字符串查找函数 编辑:程序博客网 时间:2024/06/05 16:08
这类教程有很多了,就用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;}
测试:
1 0
- 自己动手实现数据结构——AVL树(C++实现)
- C 数据结构 AVL树实现
- AVL树(c实现)
- 【算法】数据结构与算法分析学习笔记——第四章AVL树C语言实现
- AVL树C实现
- AVL树C实现
- AVL树C实现
- AVL树-C实现
- avl树 C实现
- 数据结构(三)实现AVL树
- AVL树的实现(C++)
- 数据结构——AVL树(平衡二叉树)的详细实现
- 数据结构与算法分析(三) —— AVL树的实现
- 数据结构之 AVL树(平衡二叉树)(C语言实现)
- 数据结构之---C语言实现平衡二叉树(AVL树)
- 数据结构—AVL树
- AVL树C语言实现
- AVL树 C语言实现
- Hie with the Pie
- poj-1961 Period
- PKI(公钥基础设施)基础知识笔记
- Linux内核线程之父pid=2的kthreadd线程
- 抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))
- 自己动手实现数据结构——AVL树(C++实现)
- compiz使Ubuntu unity桌面消失
- ListView滚动后内容重复的问题
- java的递归实现原理
- 设置tomcat访问首页,ip地址加端口既访问指定服务地址
- 简单的zabbix agent自动安装脚本
- 零基础学python-1.7 第二个程序 猜数字小游戏
- Getting Started with Gradle
- iOS 3D UI---CALayer的transform扩展