• 【PAT(甲级)】1066 Root of AVL Tree


    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

     Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the root of the resulting AVL tree in one line.

    Sample Input 1:

    5
    88 70 61 96 120

    Sample Output 1:

    70

    Sample Input 2:

    7
    88 70 61 96 120 90 65

    Sample Output 2:

    88

    解题思路:

    题目意思很清楚了,就是给你一个数组,让你构造平衡二叉搜索树。这里就涉及到树的旋转问题,关于树的旋转分为4类分别为LL,RR,LR,RL;对于后面两种,分别可以先对它的子树进行RR或先进行LL,转换后变成LL或RR类型,所以我主要还是讲一下LL和RR的旋转方法。

    LL类就是在当前根节点的左子树的左子树上插入了新的节点,导致树不平衡,需要旋转来构造新的平衡。例如原题中的这张图就是LL类型(图中左数的深度为2,右数的深度为0,发生了不平衡):

    对于此,我们的做法是:此时不平衡的点权重为88记作root;

    t = root->left; root->left = t->right; t->right = root; return t;

    意思就是,把左树的节点作为根节点,左树的左树为根的左树,左树的右树,为root的左树

    右树类似。

    易错点:

    只有读取入新的节点的时候才有可能会造成原来树的不平衡,所以只要在插入新节点的时候

    代码:

    1. #include
    2. using namespace std;
    3. typedef struct node Tree;
    4. struct node{
    5. int node;
    6. Tree* left;
    7. Tree* right;
    8. };
    9. Tree* LL(Tree* root){
    10. Tree* t = root->left;
    11. root->left = t->right;
    12. t->right = root;
    13. return t;
    14. }
    15. Tree* RR(Tree* root){
    16. Tree* t = root->right;
    17. root->right = t->left;
    18. t->left = root;
    19. return t;
    20. }
    21. Tree* LR(Tree* root){
    22. root->left = RR(root->left);
    23. return LL(root);
    24. }
    25. Tree* RL(Tree* root){
    26. root->right = LL(root->right);
    27. return RR(root);
    28. }
    29. int getHeight(Tree* root){
    30. if(root == NULL){
    31. return 0;
    32. }
    33. return max(getHeight(root->left),getHeight(root->right))+1;
    34. }
    35. void read(Tree* &root, int val){
    36. if(root == NULL){
    37. root = new Tree();
    38. root->left = NULL;
    39. root->right = NULL;
    40. root->node = val;
    41. }else if(val < root->node){
    42. read(root->left,val);
    43. if(getHeight(root->left)-getHeight(root->right) == 2){
    44. root = val < root->left->node ? LL(root):LR(root);
    45. }
    46. }
    47. else{
    48. read(root->right,val);
    49. if(getHeight(root->left)-getHeight(root->right) == -2){
    50. root = val > root->right->node ? RR(root):RL(root);
    51. }
    52. }
    53. }
    54. int main(){
    55. int N;
    56. cin>>N;
    57. Tree* tree = NULL;
    58. for(int i=0;i
    59. int t;
    60. cin>>t;
    61. read(tree,t);
    62. }
    63. cout<node;
    64. return 0;
    65. }
    
                    
  • 相关阅读:
    js获取当前日期(年份,月份,时间)
    阿里并发核心编程宝典(2022版)
    分布式概念-理论篇
    kubernetes网络模型
    boost序列化vector
    随机森林----评论情感分析系统
    为什么要有override
    一文讲清楚密评中的数据库存储加密 安当加密
    基于FPGA的OV7670摄像头实时检测
    网络安全常用靶场推荐
  • 原文地址:https://blog.csdn.net/weixin_55202895/article/details/126859292