看《数据结构与算法分析》第四章时介绍到了一个AVL树的东西
对于节点删除,书上只是提了一下惰性删除,也没有给出例程,这里就试着实现非惰性删除
实现的方法同二叉查找树,找一个左子树的最大节点进行替换,递归删除,并做及时的AVL树维护
对应后面的习题
4.16 指出将2,1,4,5,9,3,6,7插入到初始空的AVL树后的结果。
4.18 写出实现AVL单旋转和双旋转的其余的过程
4.20 如何能够在AVL树中实现(非惰性)删除
4.22 写出执行双旋转的函数,其效率要超过执行两个单旋转
1.AVLTree.h
先给出头文件
#ifndef _SEARCHTREE_H_
#define _SEARCHTREE_H_
#define ElementType int
//#define DELMETHOD_VIRTUAL //假性删除
#define DELMETHOD_REAL //非假性删除
struct TreeNode;
typedef struct TreeNode * pTreeNode;
struct TreeNode
{
ElementType data;
pTreeNode child_l;
pTreeNode child_r;
int height;
#ifdef DELMETHOD_VIRTUAL
int del; //del用于记录节点是否被删除了
#endif
};
pTreeNode AVLTree_insert (pTreeNode T, ElementType d);
pTreeNode AVLTree_delete (pTreeNode T, ElementType d);
pTreeNode AVLTree_find (pTreeNode T, ElementType d);
void AVLTree_print (pTreeNode T);
#endif
2.AVLTree.c
AVL树实现里,最麻烦是每次在树有变化时,都需要保证满足树的条件
所以要不断检查,旋转
插入的和书上的差不多,不过双旋转的情况下,会比调用两次单旋转更快一些
#include
#include
#include
#include "AVLTree.h"
#define getheight(T) ( ( T )? T->height : 0 )
#define MAX(A,B) ( ( A > B )? A : B )
#define CompareChild(T) ( getheight(T->chil