美文网首页
平衡二叉树

平衡二叉树

作者: 1nvad3r | 来源:发表于2020-08-26 09:14 被阅读0次
平衡二叉树的基本操作
#include <cstdio>
#include <algorithm>

using namespace std;

struct Node {
    int data, height;//data为权值,height为当前子树高度
    Node *lchild, *rchild;
};

Node *newNode(int data) {
    Node *node = new Node;
    node->data = data;
    node->height = 1;
    node->lchild = node->rchild = NULL;
    return node;
};

//获取以node为根结点的子树的当前高度
int getHeight(Node *node) {
    if (node == NULL) {
        return 0;
    }
    return node->height;
}

//计算结点node平衡因子
int getBalanceFactor(Node *node) {
    return getHeight(node->lchild) - getHeight(node->rchild);
}

//更新结点的高度
void updateHeight(Node *node) {
    node->height = max(getHeight(node->lchild), getHeight(node->rchild)) + 1;
}

//左旋
void leftRotation(Node *&node) {
    Node *temp = node->rchild;
    node->rchild = temp->lchild;
    temp->lchild = node;
    updateHeight(node);
    updateHeight(temp);
    node = temp;
}

//右旋
void rightRotation(Node *&node) {
    Node *temp = node->lchild;
    node->lchild = temp->rchild;
    temp->rchild = node;
    updateHeight(node);
    updateHeight(temp);
    node = temp;
}

void search(Node *node, int x) {
    if (node == NULL) {
        printf("search failed\n");
        return;
    }
    if (x == node->data) {
        printf("%d\n", node->data);
    } else if (x < node->data) {
        search(node->lchild, x);
    } else {
        search(node->rchild, x);
    }
}

//插入权值为data的结点
void insert(Node *&node, int data) {
    if (node == NULL) {
        node = newNode(data);
        return;
    }
    if (data < node->data) {
        insert(node->lchild, data);
        updateHeight(node);
        if (getBalanceFactor(node) == 2) {
            if (getBalanceFactor(node->lchild) == 1) {//LL型
                rightRotation(node);
            } else if (getBalanceFactor(node->lchild) == -1) {//LR型
                leftRotation(node->lchild);
                rightRotation(node);
            }
        }
    } else {
        insert(node->rchild, data);
        updateHeight(node);
        if (getBalanceFactor(node) == -2) {
            if (getBalanceFactor(node->rchild) == -1) {//RR型
                leftRotation(node);
            } else if (getBalanceFactor(node->rchild) == 1) {//RL型
                rightRotation(node->rchild);
                leftRotation(node);
            }
        }
    }
}

//AVL树的建立
Node *create(int data[], int n) {
    Node *root = NULL;
    for (int i = 0; i < n; i++) {
        insert(root, data[i]);
    }
    return root;
}

1066 Root of AVL Tree

相关文章

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • 平衡二叉树

    1)什么是平衡二叉树?2)平衡二叉树的特点是什么?3)平衡二叉树的构建实现? 一、什么是平衡二叉树?假设有一组数据...

  • 面试题:平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 知识点 平衡二叉树 Qiang的思路 平衡二叉树是指一个...

  • Leetcode 110 平衡二叉树

    平衡二叉树 题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每...

  • 二叉树2-平衡二叉树、完全二叉树、二叉树剪枝

    110.平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 一棵高度平衡二叉树定义为:一个二叉树每个节点 ...

  • Leetcode题解 - Easy - 4

    110- 平衡二叉树 问题 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一...

  • TreeMap源码分析

    TreeMap 平衡二叉树 平衡二叉树(Self-balancing binary search tree)又被称...

  • 图的应用[平衡二叉树以及散列查找]

    平衡⼆二叉树( AVL 树) 平衡⼆二叉树(Self-Balancing Binary Search Tree 或...

  • [LeetCode]110. 平衡二叉树

    110. 平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个...

  • 力扣算法 - 平衡二叉树

    平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的...

网友评论

      本文标题:平衡二叉树

      本文链接:https://www.haomeiwen.com/subject/gfqzjktx.html