linux 自平衡AVL树

AVL树是一种自平衡二叉搜索树,确保任何节点的两个子树高度差不超过1,从而保证搜索效率为O(log2n)。文章详细介绍了AVL树的平衡条件,提供了C++实现的节点创建、插入、删除和旋转操作,并通过示例展示了在网页上绘制二叉树的功能。最后,强调AVL树是BST的一种,查找节点可沿用BST的查找算法。
摘要由CSDN通过智能技术生成

简介

仔细观察BST会发现,虽然它有良好的“搜索”特性,也就是可以利用其节点之前的大小关系,很容易地从根节点开始往下走找到我们所要的节点,但它无法保证这种搜索所需要的时间长短,因为建立BST时节点的随机性可能会导致它极其“不平衡”。
12
如上图所示是一棵二叉树,显然左轻右重,事实上这棵树已经退化成了一条链表,在这棵树中搜索某一个节点的时间复杂度和链表是一样的。

这种左轻右重或者左重右轻的长短腿的情形,就是所谓的不平衡;一棵树不平衡,那么他的搜索性能将会受到影响。具体来讲,当树保持平衡时,其搜索时间复杂度是O(log2n);当树退化成链表时,其搜索时间复杂度是O(n),其他情况下树的平均搜索时间复杂度就介于这两者之间。现在的目标就是要升级我们的BST,使之带有自平衡的特性,当它发现自己的左腿长或右腿长时,会及时调整,保持平衡。

要达到此目的,首先需要量化所谓的“平衡”,其严格数学定义是:在一棵树中,如果其任意一个节点的左右子树的高度差绝对值小于或等于1,那么它就是平衡的。

下面是AVL树的算法实现,包括了节点的创建、插入、删除、旋转等算法。

算法实现

head4tree.h

//
//  Description: 本文件为二叉树核心头文件。
//               任何使用本二叉树结构算法的程序,在包含本头文件之前
//               都需要将如下宏定义成二叉树节点需要表达的数据类型:
//
//                     TREE_NODE_DATATYPE
//
//               否则二叉树的节点数据类型一律默认为 int
//

#ifndef _HEAD4TREE_H_
#define _HEAD4TREE_H_

/*
 * Any application applying this linked-tree data structure should
 * define the macro "TREE_NODE_DATATYPE" before include this head
 * file, otherwise, the macro will be defined to 'int' as follow.
 *
*/

#ifndef TREE_NODE_DATATYPE
#define TREE_NODE_DATATYPE int
#endif

#include "commonheader.h"

#define MAX(a, b) ({
      \
		typeof(a) _a = a; \
		typeof(b) _b = b; \
		(void)(&_a == &_b);\
		_a > _b? _a : _b; \
		})

typedef TREE_NODE_DATATYPE tn_datatype;


typedef struct _tree_node
{
   
	tn_datatype data;
	struct _tree_node *lchild;
	struct _tree_node *rchild;

#ifdef AVL
	int height;
#endif

}treenode, *linktree;

void pre_travel(linktree, void (*handler)(linktree));
void mid_travel(linktree, void (*handler)(linktree));
void post_travel(linktree, void (*handler)(linktree));
void level_travel(linktree, void (*handler)(linktree));

linktree bst_insert(linktree root, linktree new);
linktree
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值