平衡二叉树(可重复key)插入删除(c/c++实现)

本文介绍了如何使用C/C++实现平衡二叉树(允许重复key)的插入和删除操作。插入操作主要涉及插入节点后的平衡调整,包括四种情况的处理。删除操作则更为复杂,需要考虑删除节点的不同情况,如叶子节点、单子树节点和双子树节点的处理,并进行相应的平衡调整。
摘要由CSDN通过智能技术生成

平衡二叉树插入,比较简单,主要工作在插入结点后的调平,通过递归调用InsertAVL,插入结点调整返回调整后的数高度是否变化,依次调整返回,平衡二叉树插入结点的调整有四种情况,实现主要是在R_Balance和L_Balance里。

删除结点要复杂一点,递归查找删除结点,找到后判断:

外界链表是否为空,如果不空取下一个,树不变

否则:

1)如果为叶子结点,直接删掉,调整返回

2)如果只有一个子树,删除该节点,子树补位,调整返回

3)如果有两个子树,在左子树上向右递归查找删除最右边右孩子为空的结点,替换待删除结点,调整返回

一直在递归 +_+

AVLNode.h

struct AVLNode
{
	int key;
	int bf;//平衡因子
	AVLNode *lchild, *rchild;
	AVLNode *next; //外界链表,存放相同key值的结点
	AVLNode(int k):key(k), bf(0), lchild(nullptr), rchild(nullptr), next(nullptr){}
};

extern const int LH, RH, EH;

void L_Rotate(AVLNode **p);
void R_Rotate(AVLNode **p);

void L_Balance(AVLNode **p);
void R_Balance(AVLNode **p);

bool InsertAVL(AVLNode **t, AVLNode *p);
bool DeleteAVL(AVLNode **t, int key, AVLNode 
平衡二叉树是一种自平衡的二叉搜索树,它可以在插入删除操作后保持树的高度尽可能小。常见的平衡二叉树有AVL树和红黑树。这里我们以AVL树为例,实现一个简单的C++平衡二叉树类模板。 ```cpp #include <iostream> #include <algorithm> template <typename T> class AVLTree { public: struct Node { T key; int height; Node* left; Node* right; Node(T k) : key(k), height(1), left(nullptr), right(nullptr) {} }; AVLTree() : root(nullptr) {} ~AVLTree() { clear(root); } void insert(T key) { root = insert(root, key); } void remove(T key) { root = remove(root, key); } private: Node* root; int height(Node* node) { return node ? node->height : 0; } int balanceFactor(Node* node) { return height(node->left) - height(node->right); } void updateHeight(Node* node) { node->height = std::max(height(node->left), height(node->right)) + 1; } Node* rotateRight(Node* y) { Node* x = y->left; y->left = x->right; x->right = y; updateHeight(y); updateHeight(x); return x; } Node* rotateLeft(Node* x) { Node* y = x->right; x->right = y->left; y->left = x; updateHeight(x); updateHeight(y); return y; } Node* balance(Node* node) { updateHeight(node); if (balanceFactor(node) == 2) { if (balanceFactor(node->left) < 0) { node->left = rotateLeft(node->left); } return rotateRight(node); } else if (balanceFactor(node) == -2) { if (balanceFactor(node->right) > 0) { node->right = rotateRight(node->right); } return rotateLeft(node); } return node; } Node* insert(Node* node, T key) { if (!node) { return new Node(key); } if (key < node->key) { node->left = insert(node->left, key); } else if (key > node->key) { node->right = insert(node->right, key); } else { return node; } return balance(node); } Node* findMin(Node* node) { return node->left ? findMin(node->left) : node; } Node* removeMin(Node* node) { if (!node->left) { return node->right; } node->left = removeMin(node->left); return balance(node); } Node* remove(Node* node, T key) { if (!node) { return nullptr; } if (key < node->key) { node->left = remove(node->left, key); } else if (key > node->key) { node->right = remove(node->right, key); } else { if (!node->left || !node->right) { Node* temp = node->left ? node->left : node->right; if (!temp) { temp = node; node = nullptr; } else { *node = *temp; } delete temp; } else { Node* temp = findMin(node->right); node->key = temp->key; node->right = removeMin(node->right); } } if (!node) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值