【算法】数据结构与算法分析学习笔记——第四章AVL树C语言实现

本文是关于《数据结构与算法分析》第四章AVL树的学习笔记,介绍了AVL树的C语言实现,包括节点删除操作。通过非惰性删除方法,当删除节点时,寻找左子树的最大节点进行替换并递归删除,同时维护AVL树的平衡。此外,文章还涵盖了AVL树的插入、单旋转、双旋转以及相关的习题解答。
摘要由CSDN通过智能技术生成

看《数据结构与算法分析》第四章时介绍到了一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值