1123. Is It a Complete AVL Tree (30)

本文介绍了一种二叉平衡树的实现方法,包括插入操作及保持平衡的旋转调整,并通过层序遍历验证是否构成完全二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址
考了二叉平衡树,完全二叉树的判断,树的遍历,其中二叉平衡树写起来比较麻烦。
创建一个null结点,令所有的叶结点都指向它,这样在通过左右孩子结点更新高度时就不会访问到空指针,因为最底下就是null,而它不为空,它的高度设置为0;同时插入新结点insert(Node *&node,data)是递归插入,会插入到原树的叶结点下面,所以updateHeight()函数是从底向上一层一层更新高度的,当然旋转之后也要更新高度。

//
// Created by aleafall on 16-12-10.
//

#include <bits/stdc++.h>

using namespace std;

int n, cnt = 0, max_index = 0;
struct Node {
    int data, height;
    Node *left, *right;
} *root, *null;
//更新结点的高度
void updateHeight(Node *node) {
    node->height = max(node->left->height, node->right->height) + 1;
}
//左旋转
void L(Node *&node) {
    Node *temp = node->right;
    node->right = temp->left;
    temp->left = node;
    updateHeight(node);
    updateHeight(temp);
    node = temp;
}
//右旋转
void R(Node *&node) {
    Node *temp = node->left;
    node->left = temp->right;
    temp->right = node;
    updateHeight(node);
    updateHeight(temp);
    node = temp;
}
//插入新结点
void insert(Node *&node, int data) {
    if (node == null) {
        node = new Node;
        node->data = data;
        node->height = 1;
        node->left = node->right = null;
        return;
    }
    if (data < node->data) {
        insert(node->left, data);
        updateHeight(node);
        if (node->left->height - node->right->height > 1) {
            if (node->left->left->height - node->left->right->height == 1) {
                R(node);
            } else if (node->left->left->height - node->left->right->height == -1) {
                L(node->left);
                R(node);
            }
        }
    } else {
        insert(node->right, data);
        updateHeight(node);
        if (node->right->height - node->left->height > 1) {
            if (node->right->right->height - node->right->left->height == 1) {
                L(node);
            } else if (node->right->right->height - node->right->left->height == -1) {
                R(node->right);
                L(node);
            }
        }
    }
}
//初始化最底下的结点
void init() {
    null = new Node;
    null->height = 0;
    root = null;
}
//层序遍历
void levelOrder(Node *node) {
    queue<Node *> q;
    q.push(node);
    while (!q.empty()) {
        Node *temp = q.front();
        q.pop();
        ++cnt;
        if (cnt < n) {
            cout << temp->data << " ";
        } else {
            cout << temp->data << endl;
        }
        if (temp->left != null) {
            q.push(temp->left);
        }
        if (temp->right != null) {
            q.push(temp->right);
        }
    }
}
//先序遍历,找到最大的索引
void preOrder(Node *node, int index) {
    if (node == null) {
        return;
    }
    max_index = max(max_index, index);
    preOrder(node->left, 2 * index);
    preOrder(node->right, 2 * index + 1);
}

int main() {
    init();
    int x;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> x;
        insert(root, x);
    }
    levelOrder(root);
    preOrder(root, 1);
    max_index == n ? printf("YES\n") : printf("NO\n");
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值