C++实现BSTree与AVLTree
回顾树结构时,本打算写个小程序实现一下练练手。
而作为常见的树结构,BSTree与AVLTree 应该是最容易被提到的。关于这连个树结构,这里不负责讲解。
但是在实现的时候却发现有许多细节上处理需要注意。思想很简单,实现起来还是有一定难度的。像能轻松知道破解原理和步骤,但是实际破解却费时费力。
遵从 算法导论的思想 喜欢在 树节点中增加父节点。所以与其他实现可能有些不同。
本代码实现许多地方用了 一步一步写平衡二叉树 博文中的内容。文章写的蛮清晰,推荐以此为参考
网上有很多的思想介绍和伪码,但是具体能用的倒不多,下面给出自己编写的代码,测试且单步过,完全可用(可花了好几天...)
下面贴出源码
(源码可能有些冗余,如果有改进后更好的方式,可给我反馈一份 :-D )
//BST
//参考博客:http://www.cppblog.com/cxiaojia/archive/2014/03/02/187776.html
#ifndef _BSTREE_H
#define _BSTREE_H
#include <stdio.h>
#define _CRT_RAND_S
#include <stdlib.h>
#include <iostream>
using namespace std;
//二叉树节点
template<class T>
class TreeNode
{
public:
TreeNode():lson(NULL),rson(NULL),parrent(NULL),freq(1),hg(0){}
public:
T data; //数据
int freq; //频率,默认=1
int hg; //高度,默认=0
TreeNode* lson; //指向左儿子的地址
TreeNode* rson; //指向右儿子的地址
TreeNode* parrent; //指向父节点的地址
};
//BST树类的属性和方法声明
template<class T>
class BSTree
{
public:
TreeNode<T>* root ; //根
public:
BSTree(TreeNode<T>* p=NULL){
root = p;
}
TreeNode<T>* Search(T x); //查找 data == x 的节点
TreeNode<T>* Min(TreeNode<T>* x); //返回最小节点(最左子节点)
TreeNode<T>* Max(TreeNode<T>* x); //返回最大节点(最右子节点)
TreeNode<T>* Successor(TreeNode<T>* x); //返回节点x的后继
TreeNode<T>* Predecessor(TreeNode<T>* x); //返回x的前趋
TreeNode<T>* Insert(T x); //插入,返回插入点
void Insert2(T x); //递归插入
void InsertPt(TreeNode<T>* &node, T &x); //在node下面插
bool Delete(T x); //删除
void TraverseTree(); //遍历
void InTraverNode(TreeNode<T>* node); //中序遍历节点node
};
//AVL树属性和方法声明
template<class T>
class AVLTree:public BSTree<T>
{
//private:
// TreeNode<T>* root; //根节点
private:
// void insertpri(TreeNode<T>* &node,T x);//插入
// TreeNode<T>* findpri(TreeNode<T>* node,T x);//查找
// void insubtree(TreeNode<T>* node);//中序遍历
// void Deletepri(TreeNode<T>* &node,T x);//删除
int height(TreeNode<T>* node);//求树的高度
void SingRotateLeft(TreeNode<T>* &k2);//左左情况下的旋转
void SingRotateRight(TreeNode<T>* &k2);//右右情况下的旋转
void DoubleRotateLR(TreeNode<T>* &k3);//左右情况下的旋转
void DoubleRotateRL(TreeNode<T>* &k3);//右左情况下的旋转
public:
AVLTree(TreeNode<T>* p=NULL):BSTree(p){}
void Insert2(T x); //递归插入
void InsertPt(TreeNode<T>* &node, T &x); //在node节点下插入
void Delete(T x); //删除操作
void DeletePt(TreeNode<T>* &node, T &x); //在node节点下删除
TreeNode<T>* Search(T x); //查找接口
void TraverseTree(); //遍历
void InTraverNode(TreeNode<T>* node); //中序遍历节点node
};
/
// BST 树实现
/
//在树中中查找 data为 x 的节点
template<class T>
TreeNode<T>* BSTree<T>::Search(T x)
{
TreeNode<T>* tmp = root;
while( tmp && tmp->data != x )
{
if( x < tmp->data )
tmp = tmp->lson;