PAT Advanced 1123 Is It a Complete AVL Tree (30) [AVL树]

题目

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node difer by at most one; if at any time they difer 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 output the level-order traversal sequence of the resulting AVL tree, and to tell if it is a complete binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<= 20). 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, insert the keys one by one into an initially empty AVL tree. Then first print in a line the level-order traversal sequence of the resulting AVL tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line. Then in the next line, print “YES” if the tree is complete, or “NO” if not.
Sample Input 1:
5
88 70 61 63 65
Sample Output 1:
70 63 88 61 65
YES
Sample Input 2:
8
88 70 61 96 120 90 65 68
Sample Output 2:
88 65 96 61 70 90 120 68
NO

题目分析

已知平衡二叉树的建树序列,求二叉平衡树的层序序列,并判断是否是完全二叉树

解题思路

  1. 平衡二叉树建树(左右旋)
  2. 判断是否是二叉树
    思路1:记录每个节点的index,根节点index=i,左子节点index=2i+1,右子节点index=2i+2。判断最后一个节点的index==n-1,相等即为完全二叉树
    思路2:出现过NULL值后,若不再出现非NULL节点,即为完全二叉树

Code

Code 01

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct node {
    int data;
    int heigh=0;
    int index=-1;
    node * left=NULL;
    node * right=NULL;
    node() {}
    node(int _data):data(_data) {
        heigh=1;
    }
};
int getHeigh(node * root) {
    if(root==NULL)return 0;
    else return root->heigh;
}
int getBalanceFactor(node * root) {
    return getHeigh(root->left)-getHeigh(root->right);
}
void updateHeigh(node * root) {
    root->heigh=max(getHeigh(root->left),getHeigh(root->right))+1;
}
void L(node * &root) {
    node * temp=root->right;
    root->right=temp->left;
    temp->left = root;
    updateHeigh(root);
    updateHeigh(temp);
    root=temp;
}
void R(node * &root) {
    node * temp=root->left;
    root->left=temp->right;
    temp->right=root;
    updateHeigh(root);
    updateHeigh(temp);
    root = temp;
}
void insert(node * &root, int val) {
    if(root==NULL) {
        root=new node(val);
        return;
    }
    if(val<root->data) {
        insert(root->left,val);
        updateHeigh(root);
        if(getBalanceFactor(root)==2) {
            if(getBalanceFactor(root->left)==1) {
                R(root);
            } else if (getBalanceFactor(root->left)==-1) {
                L(root->left);
                R(root);
            }
        }
    } else {
        insert(root->right,val);
        updateHeigh(root);
        if(getBalanceFactor(root)==-2) {
            if(getBalanceFactor(root->right)==-1) {
                L(root);
            } else if (getBalanceFactor(root->right)==1) {
                R(root->right);
                L(root);
            }
        }
    }
}
vector<node*>nds;
/*
思路一:使用index判断是否完全二叉树
*/
//void levelOrder(node * root){
//  queue<node*> q;
//  root->index = 0;
//  q.push(root);
//  while(!q.empty()){
//      node * now = q.front();
//      q.pop();
//      nds.push_back(now);
//      if(now->left!=NULL){
//          now->left->index=now->index*2+1;
//          q.push(now->left);
//      }
//      if(now->right!=NULL){
//          now->right->index=now->index*2+2;
//          q.push(now->right);
//      }
//  }
//}
/*
思路二:出现NULL后不再出现非NULL节点即为完全二叉树
*/
int isComplete = 1, after = 0;
void levelOrder(node *tree) {
    queue<node *> queue;
    queue.push(tree);
    while (!queue.empty()) {
        node *temp = queue.front();
        queue.pop();
        nds.push_back(temp);
        if (temp->left != NULL) {
            if (after) isComplete = 0;
            queue.push(temp->left);
        } else {
            after = 1;
        }
        if (temp->right != NULL) {
            if (after) isComplete = 0;
            queue.push(temp->right);
        } else {
            after = 1;
        }
    }
}
bool cmp(node * &n1,node * &n2) {
    return n1->index<n2->index;
}
int main(int argc,char * argv[]) {
    int n,m;
    scanf("%d",&n);
    node * root=NULL;
    for(int i=0; i<n; i++) {
        scanf("%d",&m);
        insert(root,m);
    }
    levelOrder(root);
    for(int i=0; i<nds.size(); i++) {
        printf("%d",nds[i]->data);
        if(i!=nds.size()-1)printf(" ");
        else printf("\n");
    }
    // 思路一:使用index判断是否完全二叉树
//  if(nds[n-1]->index==n-1) printf("YES");
//  else printf("NO");

    // 思路二:出现NULL后不再出现非NULL节点即为完全二叉树
    if(isComplete) printf("YES");
    else printf("NO");
    return 0;
}


猜你喜欢

转载自www.cnblogs.com/houzm/p/12340674.html