PAT 1123—— Is It a Complete AVL Tree(平衡二叉树)【左旋右旋各种旋】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ming991301630/article/details/79580452
#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
    int value;
    TreeNode *left, *right;
    TreeNode(const int x) :value(x), left(nullptr), right(nullptr) {}
};
TreeNode *root = nullptr;
TreeNode* leftRotate(TreeNode *root) {//左旋
    TreeNode *temp = root->right;
    root->right = temp->left;
    temp->left = root;
    return temp;
}
TreeNode* rightRotate(TreeNode *root) {//右旋
    TreeNode *temp = root->left;
    root->left = temp->right;
    temp->right = root;
    return temp;
}
TreeNode* leftRightRotate(TreeNode *root) {////左子树左旋,整棵树右旋
    root->left = leftRotate(root->left);
    TreeNode *newRoot = rightRotate(root);
    return newRoot;
}
TreeNode* rightLeftRotate(TreeNode *root) {//右子树右旋,整棵树左旋
    root->right= rightRotate(root->right);
    TreeNode *newRoot = leftRotate(root);
    return newRoot;
}
int getHeight(TreeNode* node)//递归求该节点的高度
{
    if (node == nullptr)return 0;
    int left = getHeight(node->left);
    int right = getHeight(node->right);
    return max(left, right) + 1;
}
TreeNode* Insert(TreeNode* node, int insertNum)//二叉排序树插入
{
    if(node == nullptr)
    {
        node = new TreeNode(insertNum);
    }else
    {
        if(node->value < insertNum)//右插
        {
            node->right = Insert(node->right, insertNum);//右插完之后获取插完的根节点
            int leftH = getHeight(node->left);//插完之后,通过高度判断这个节点是否平衡
            int rightH = getHeight(node->right);
            if (abs(rightH - leftH) >= 2)//开始旋转达到平衡
            {
                if(insertNum > node->right->value)
                {
                    node = leftRotate(node);
                }else
                {
                    node = rightLeftRotate(node);
                }
            }
        }else//左插
        {
            node->left = Insert(node->left, insertNum);//左插完之后获取插完的根节点
            int leftH = getHeight(node->left);//插完之后,通过高度判断这个节点是否平衡
            int rightH = getHeight(node->right);
            if (abs(rightH - leftH) >= 2)//开始旋转达到平衡
            {
                if (insertNum > node->left->value)
                {
                    node = leftRightRotate(node);
                }else
                {
                    node = rightRotate(node);
                }
            }
        }
    }
    return node;
}
using namespace std;
int main() {
    int N, inputNum;
    scanf_s("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf_s("%d", &inputNum);
        root = Insert(root, inputNum);
    }
    bool isACompletedTree = true;
    int nodeNum = 0;
    queue<TreeNode*>Q;
    Q.push(root);
    while (!Q.empty())//广搜,判断是否是完全二叉树
    {
        TreeNode* popNode = Q.front();
        Q.pop();
        ++nodeNum;
        if (isACompletedTree && popNode->left != nullptr)
            Q.push(popNode->left);
        else
            isACompletedTree = false;
        if (isACompletedTree && popNode->right != nullptr)
            Q.push(popNode->right);
        else
            isACompletedTree = false;
    }
    vector<int>result;
    queue<TreeNode*>QQ;
    QQ.push(root);
    while (!QQ.empty())//广搜,每层节点
    {
        TreeNode* popNode = QQ.front();
        QQ.pop();
        result.push_back(popNode->value);
        if (popNode->left != nullptr)
            QQ.push(popNode->left);
        if (popNode->right != nullptr)
            QQ.push(popNode->right);
    }
    for (int i = 0; i < result.size() - 1; ++i)
        cout << result[i] << " ";
    cout << result[result.size() - 1] << endl;
    if (nodeNum == N)
        printf("YES\n");
    else
        printf("NO\n");
}

猜你喜欢

转载自blog.csdn.net/Ming991301630/article/details/79580452