您的位置:首页 > 其它

AVL树的实现

2015-09-02 18:13 281 查看
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

下面是我的实现,这个算法还是纠结了蛮久的

// AVL-Tree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <crtdbg.h>
#include<vector>

#define MIN 1000000
struct TreeNode{
int ele;
TreeNode*lnode, *rnode, *parent;
};

TreeNode*minmax = NULL;
int minvalue = MIN;
void find_postion(TreeNode*node, int value)
{
if (node == NULL)
return;
if (node->ele - value > 0 && node->ele - value < minvalue)
{
minmax = node;
minvalue = node->ele - value;
}
find_postion(node->lnode, value);
find_postion(node->rnode, value);
}
int depth_between(TreeNode*floor, TreeNode*ceiling)
{
_ASSERTE(floor != NULL);
int dep = 1;
while (ceiling != floor)
{
floor = floor->parent;
dep++;
}
return dep;
}

int maxdep = 0;
int mindep = MIN;
void depth(TreeNode*ceiling, TreeNode*node)
{
if (node == NULL)
return;
int dep = depth_between(node, ceiling);
if (node->lnode == NULL&&node->rnode == NULL&&dep < mindep)
{
mindep = dep;
}
if (dep > maxdep)
{
maxdep = dep;
}
depth(ceiling, node->lnode);
depth(ceiling, node->rnode);
}

int tree_depth(TreeNode*node)
{
maxdep = 0;
mindep = MIN;
depth(node, node);
return maxdep;
}

int is_balence(TreeNode*node)
{
return tree_depth(node->lnode) - tree_depth(node->rnode);
}

std::vector<TreeNode*>vec;

void inorder(TreeNode*node)
{
if (node == NULL)
return;
inorder(node->lnode);
vec.push_back(node);
inorder(node->rnode);
}

void adjust(TreeNode*root, TreeNode*node)//插入删除后做调整
{
while (node != NULL)
{
int aa = tree_depth(node->lnode);
int bb = tree_depth(node->rnode);
int tt = is_balence(node);
if (tt > 1)
{
if (node->rnode == NULL)
{
if (node->lnode->rnode != NULL)
{
int temp = node->ele;
node->ele = node->lnode->rnode->ele;
node->lnode->rnode->ele = temp;
node->rnode = node->lnode->rnode;
node->lnode->rnode = NULL;
node->rnode->parent = node;
node = node->parent;
}
else
{
int temp = node->ele;
node->ele = node->lnode->ele;
node->lnode->ele = node->lnode->lnode->ele;
node->rnode = node->lnode->lnode;
node->rnode->parent = node;
node->lnode->lnode = NULL;
node->rnode->ele = temp;
node = node->parent;
}
}
else
{

TreeNode*t3 = node->lnode;
_ASSERTE(t3 != NULL);

while (t3->rnode != NULL)
{
t3 = t3->rnode;
}

TreeNode*t4;
t4 = node->rnode;
while (t4->rnode != NULL)
{
t4 = t4->rnode;
}

if (t4->parent->lnode == NULL)//旋转一次,便于后续插入
{
int temp = t4->parent->ele;
t4->parent->ele = t4->ele;
t4->ele = temp;
t4->parent->lnode = t4;
t4->parent->rnode = NULL;
}
TreeNode*t5 = t3->parent;
if (t3->lnode != NULL)
{
t3->lnode->parent = t3->parent;
}
t3->parent->rnode = t3->lnode;
t3->lnode = NULL;

vec.clear();
inorder(node->rnode);
int temp = node->ele;
node->ele = t3->ele;
int t = vec[0]->ele;
vec[0]->ele = temp;
temp = vec.back()->ele;
if (vec.size() == 1)
temp = t;
for (int i = 1; i < vec.size(); i++)
{
vec[i]->ele = vec[i - 1]->ele;
}
vec.back()->rnode = t3;
//t3->lnode = t3->rnode = NULL;
t3->ele = temp;
t3->parent = vec.back();

node = t5;
}
}//end of tt>1

else if (tt < -1)
{
if (node->lnode==NULL)
{
if (node->rnode->rnode != NULL)
{
int temp = node->ele;
node->ele = node->rnode->ele;
node->rnode->ele = node->rnode->rnode->ele;
node->lnode = node->rnode->rnode;
node->rnode->rnode = NULL;
node->lnode->ele = temp;
node->lnode->parent = node;
node = node->parent;
}
else
{
node->lnode = node->rnode->lnode;
node->lnode->parent = node;
node->rnode->lnode = NULL;
int temp=node->lnode->ele;
node->lnode->ele = node->ele;
node->ele = temp;
node = node->parent;
}
}
else//node->lnode !=NULL
{
TreeNode*t1 = node->lnode;
while (t1->rnode != NULL)
{
t1 = t1->rnode;
}
if (t1->parent->lnode == NULL)//旋转,便于后续插入
{
_ASSERTE(t1->lnode == NULL&&t1->rnode == NULL);
int temp = t1->ele;
t1->ele = t1->parent->ele;
t1->parent->ele = temp;
t1->parent->lnode = t1;
t1->parent->rnode = NULL;
}
TreeNode*t2 = node->rnode->lnode;
_ASSERTE(t2 != NULL);
while (t2->lnode != NULL)
{
t2 = t2->lnode;
}
TreeNode*t3 = t2->parent;
t2->parent->lnode = t2->rnode;
if (t2->rnode!=NULL)
t2->rnode->parent = t2->parent;
t1->rnode = t2;
t2->rnode = NULL;
t2->parent = t1;
int temp = node->ele;
node->ele = t2->ele;
t2->ele = temp;

node = t3;
}
}//end of tt<-1

else //-2<tt<2,无需调整
node = node->parent;
}

}

TreeNode* insert(TreeNode*root, int value)//插入
{
if (root == NULL)//当前树为空
{
root = new TreeNode;
root->ele = value;
root->lnode = root->rnode = root->parent = NULL;
return root;
}

minmax = NULL;
minvalue = MIN;
find_postion(root, value);
if (minmax == NULL)//要插入的值比树中所有节点的都大
{
if (root->rnode == NULL)
{
TreeNode*node = new TreeNode;
node->ele = value;
node->parent = root;
root->rnode = node;
node->lnode = node->rnode = NULL;
TreeNode*floor = NULL;
maxdep = -1;
depth(root, root);
_ASSERTE(maxdep == 2);
return root;
}

TreeNode*r_node = root;
while (r_node->rnode != NULL)
{
r_node = r_node->rnode;
}
TreeNode*node = new TreeNode;
node->ele = value;
node->parent = r_node;
r_node->rnode = node;
node->lnode = node->rnode = NULL;
adjust(root, r_node->parent);
return root;
}

TreeNode*nn = minmax->lnode;
if (nn == NULL)
{
TreeNode*node = new TreeNode;
node->ele = value;
node->lnode = node->rnode = NULL;
minmax->lnode = node;
node->parent = minmax;
adjust(root, minmax->parent);//对树做调整
return root;
}
while (nn->rnode != NULL)
{
nn = nn->rnode;
}
TreeNode*node = new TreeNode;
node->ele = value;
node->parent = nn;
nn->rnode = node;
node->lnode = node->rnode = NULL;
adjust(root,nn->parent);//对树做调整
return root;
}
TreeNode*bbb=NULL;
void find(TreeNode*node,const int value)//查找
{
if (node != NULL)
{
if (node->ele == value)
bbb=node;
if (node->ele > value)
find(node->lnode, value);
else
find(node->rnode, value);
}
}

TreeNode*erase(TreeNode*root,const int value)//删除
{
bbb = NULL;
find(root, value);
TreeNode*tobedel = bbb;
if (tobedel != NULL)
{
if (tobedel == root)
{
if (root->lnode == NULL)
{
TreeNode*nn = root->rnode;
nn->parent = NULL;
delete root;
return nn;
}
TreeNode*t1 = root->lnode;
while (t1->rnode != NULL)
{
t1 = t1->rnode;
}
TreeNode*aa = t1->parent;
t1->parent->rnode = t1->lnode;
if (t1->lnode != NULL)
t1->lnode->parent = t1->parent;

t1->lnode = root->lnode;
root->lnode->parent = t1;
t1->parent = NULL;
t1->rnode = root->rnode;
if (root->rnode != NULL)
root->rnode->parent = t1;
if (aa == root)
aa=t1;
delete root;
adjust(t1, aa);
return t1;
}

if (tobedel->lnode == NULL)
{
tobedel->parent->lnode = tobedel->rnode;
if (tobedel->rnode != NULL)
tobedel->rnode->parent = tobedel->parent;
TreeNode*aa = tobedel->parent;
delete tobedel;
adjust(root, aa);
return root;
}
TreeNode*t1 = tobedel->lnode;
while (t1->rnode != NULL)
{
t1 = t1->rnode;
}

t1->parent->rnode = t1->lnode;
if (t1->lnode != NULL)
t1->lnode->parent = t1->parent;
t1->lnode = NULL;
TreeNode*aa = t1->parent;
if (tobedel->parent->lnode == tobedel)
{
tobedel->parent->lnode = t1;
t1->parent = tobedel->parent;
tobedel->parent->rnode = tobedel->rnode;
if (tobedel->rnode != NULL)
tobedel->rnode->parent = tobedel->parent;
delete tobedel;
adjust(root, aa);
return root;
}
else
{
tobedel->parent->rnode = t1;
t1->parent = tobedel->parent;
tobedel->parent->rnode = tobedel->rnode;
if (tobedel->rnode != NULL)
tobedel->rnode->parent = tobedel->parent;
delete tobedel;
adjust(root, aa);
return root;
}
}

return root;
}

int _tmain(int argc, _TCHAR* argv[])
{
TreeNode*root = NULL;
root=insert(root, 100);
root=insert(root, 200);
root=insert(root, 300);
root=insert(root, 50);
root = insert(root, 20);
root = insert(root, 500);
root = insert(root, 700);
root = insert(root, 1100);
root = insert(root, 1500);
root = insert(root, 900);
root = insert(root, 1000);
root = insert(root, 150);
root = insert(root, 350);
root = insert(root, 250);
root = insert(root, 15);
root = insert(root, 10);
root = insert(root, 8);
root = insert(root, 5);

bbb = NULL;
find(root, 150);
TreeNode*aa = bbb;

root = erase(root, 300);
root = erase(root, 150);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: