实现平衡二叉树的各种算法

平衡二叉树简介

平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点总数的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log(n)),大大降低了操作的时间复杂度。

平衡二叉树各种基本算法

1、插入新结点
2、前序、中序、后序遍历二叉树 (递归)
3、前序、中序、后序遍历二叉树 (非递归)
4、层次遍历二叉树
5、在二叉树中查找给定关键字
6、交换各结点的左右子树
7、求二叉树的深度
8、叶子结点数
9、删除某结点

经过我的学习,我认为其难点主要在于新结点插入后、旧结点删除后的再平衡以及二叉树后序遍历的非递归算法。本篇文章是我在学习过程中的一些总结,希望能够对大家有所帮助,也希望大家如果发现了我的错误,能够及时帮我指正。接下来,我将重点针对插入新节点、后序遍历二叉树(非递归)算法进行总结(删除某结点算法将在后续更新,敬请期待)。

初始定义

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

#define LH +1
#define EH 0
#define RH -1

typedef struct BiTNode
{
    int data;
    int bf;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

插入新结点

在写插入新结点的算法之前,我们需要对各种需要平衡的情况以及如何平衡进行了解。
其中,各种需要平衡的情况及实例可参考https://blog.csdn.net/weixin_40374341/article/details/87886807
不难发现,需要平衡的情况可分为四种:LL型、RR型、LR型以及RL型。但是在我的学习过程中,我发现如果按照这四种类型进行代码的编写,写出来的代码不仅冗长而且难以调试,因此我采用下面的方法进行代码的编写。
在平衡二叉树T上插入一个新的数据元素e的递归算法可描述如下:
①若T为空树,则插入一个数据元素为e的新结点作为T的根结点,树的深度增1。
②若e的关键字和T的根结点的关键字相等,则不进行插入。
③若e的关键字小于T的根结点的关键字,而且在T的左子树中不存在和e有相同关键字的结点,则将e插入在T的左子树上,并且当插入之后的左子树深度增加(+1)时,分别就下列不同情况处理:
●T的根结点的平衡因子为-1(右子树的深度大于左子树的深度)则将根结点的平衡因子更改为0,T的深度不变;
●T的根结点的平衡因子为0(左、右子树的深度相等)则将根结点的平衡因子更改为1,T的深度增加1;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值