平衡二叉树(C++) -- 左旋旋右旋旋

本文详细介绍了平衡二叉搜索树的四种旋转操作:左单旋、右单旋、左右双旋和右左双旋,以及它们在保持树平衡中的作用。通过旋转,确保树的高度差不超过1,从而保持查找的效率在O(logn)级别。同时提到了在插入和删除操作中如何维护树的平衡状态。
摘要由CSDN通过智能技术生成

平衡二叉树(C++) – 左旋旋右旋旋

  平衡二叉树全称平衡二叉搜索树,所以首先具备了二叉搜索树的特性,因为二叉搜索树并未对树的高做限制,只要求了左小右大,这就可能再极端情况下,出现左斜树或右斜树,这是查找就从O(logn)的期望退化成了O(n),即使不那么极端,树的高度也是没办法控制在一个稳定值上,这就使得当数据量庞大时,查找耗时过多;这就产生了如何对一棵树进行优化,使其高度稳定,这就首先需要对树的高度进行获取和记录,通过左旋和右旋使二叉搜索树达到平衡,也就是使各节点左子树和右子树的高度差不超过1,这样的查找时间复杂度就能稳定在O(logn)级别;
  因为二叉搜索树中形成不平衡的情况有很多种,所以旋转方式有4种,分别是左单旋,右单旋,左右双旋,右左双旋,而左右双旋其实就是先右旋然后左旋,右左双旋就是先左旋然后右旋;还有就是左单旋与右单旋对称,左右双旋与右左双旋对称~~

平衡二叉树 – 左单旋

左单旋:需要左单旋时,节点的造型是tree节点有一个左子节点和一个左孙节点,将子节点调为父节点,原tree节点调为右节点即可,这个过程中,原左子节点可能会有右子节点,这个右子节点必定小于tree节点,所以可以作为tree节点的左子节点;注意更新高度~~

// 左单旋
Node* __singleLeftRotation(Node* tree) {
        Node* newRoot = tree->left;
        tree->left = newRoot->right;
        newRoot->right = tree;
        // 高度的更新必须重新获取,再+1,更新时不能直接对高度进行+1或-1,因为当左单旋和右单旋在各节点的子节点情况不同下,
        // 高度的变换并非定值,而是由子节点情况决定的
        tree->height = max(getHeight(tree->left),getHeight(tree->right)) + 1;
        newRoot->height = max(getHeight(newRoot->left),getHeight(tree->right)) + 1;

        return newRoot;
    }

平衡二叉树 – 右单旋

右单旋:需要右单旋时,因为与左单旋对称,所以就是对应上面的左单旋,左改右,右改左;注意更新高度~~

// 右单旋
Node* __singleRightRotation(Node* tree) {
        Node* newRoot = tree->right;
        tree->right = newRoot->left;
        newRoot->left = tree;
        tree->height = max(getHeight(tree->left),getHeight(tree->right)) + 1;
        newRoot->height = max(getHeight(newRoot->left),getHeight(tree->right)) + 1;

        return newRoot;
    }

平衡二叉树 – 左右双旋

左右双旋:从下往上,先右旋再左旋

// 左单旋
Node* __doubleLeftRightRotation(Node* tree) {
        tree->left = __singleRightRotation(tree->left);

        return __singleLeftRotation(tree);
    }

平衡二叉树 – 右左双旋

右左双旋:从下往上,先左旋再右旋

// 右左双旋
Node* __doubleRightLeftRotation(Node* tree) {
        tree->right = __singleLeftRotation(tree->right);

        return __singleRightRotation(tree);
    }

平衡二叉树 – 插入和删除实现

  平衡二叉树在进行插入和删除时都可能使二叉搜索树中某节点上的左右子树高度不平衡(高度差大于1),所以在进行插入和删除操作时为了维护平衡二叉树的属性,就需要获取受影响节点的左右子树的高度,当高度差大于1时(因为一直在维护,所以高度差最大为2),进行左旋旋右旋旋,具体过程较为复杂,在__insert(插入方法)和__remove(删除方法)中有具体说明~~

// 平衡二叉树
class AVLTree {

private:
    // 平衡二叉树中的节点
    struct Node {
        KeyType key;
        ValueType value;
        Node* left;
        Node* right;
        // 平衡二叉树因为需要维持高度平衡,所以节点中需要记录高度
        int height;

        Node(KeyType key, ValueType value) {
            this->key = key;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值