题目粗心
给定一颗均衡二叉树的插入序列,要求输入它的层序序列并判断是否为齐全二叉树。
算法思路
首先须要对该AVL树进行建树操作(具体不细说,看代码即可),而后对该树进行层序遍历,一边输入层序变量序列,一遍判断该树是否是齐全二叉树
判断二叉树是否是齐全二叉树的办法为:
- 1、如果以后节点只有右孩子,肯定不是。
- 2、如果以后节点有孩子,然而其前驱节点中存在孩子缺失的状况,那么肯定不是。
提交后果
AC代码
#include<cstdio>#include<queue>#include<set>using namespace std;struct Node { int v; Node *left; Node *right; int height;};int n;//生成新的结点Node *newNode(int v) { Node *w = new Node; w->v = v; w->height = 1; w->left = nullptr; w->right = nullptr; return w;}int getHeight(Node *root) { if (root == nullptr) { return 0; } else { return root->height; }}int getBalancedFactor(Node *root) { return getHeight(root->left) - getHeight(root->right);}void updateHeight(Node *&root) { root->height = max(getHeight(root->left), getHeight(root->right)) + 1;}void L(Node *&root) { Node *temp = root->right; root->right = temp->left; temp->left = root; updateHeight(root); updateHeight(temp); root = temp;}void R(Node *&root) { Node *temp = root->left; root->left = temp->right; temp->right = root; updateHeight(root); updateHeight(temp); root = temp;}void insert(Node *&root, int x) { if (root == nullptr) { root = newNode(x); return; } if (root->v < x) { insert(root->right, x); // 插入实现后得得更新root的高度 updateHeight(root); if (getBalancedFactor(root) == -2) { if (getBalancedFactor(root->right) == -1) { //RR型须要对root左旋一次 L(root); } else if (getBalancedFactor(root->right) == 1) { // RL型,先对root->right右旋,再对root左旋 R(root->right); L(root); } } } else { insert(root->left, x); // 插入实现后得得更新root的高度 updateHeight(root); if (getBalancedFactor(root) == 2) { if (getBalancedFactor(root->left) == 1) { // LL型须要对root右旋一次 R(root); } else if (getBalancedFactor(root->left) == -1) { // LR型,先对root->left左旋,再对root右旋 L(root->left); R(root); } } }}Node *createTree(int data[]) { Node *root = nullptr; for (int i = 0; i < n; ++i) { insert(root, data[i]); } return root;}bool isComplete = true;bool onlyLeft = false;// 记录前驱是否只有左孩子bool noChildren = false;// 记录前驱是否没有孩子int num = 0;// 打印管制void layerOrder(Node *root) { queue<Node *> q; q.push(root); bool flag1 = false, flag2 = false; while (!q.empty()) { Node *t = q.front(); q.pop(); printf("%d", t->v); if (num < n - 1) { printf(" "); } else { printf("\n"); } ++num; if (t->left) { q.push(t->left); } if (t->right) { q.push(t->right); } // 判断是否是齐全二叉树 if (t->left == nullptr && t->right != nullptr) { // 只有右孩子 isComplete = false; } else if(noChildren||onlyLeft){ if(t->left != nullptr||t->right != nullptr){ // 前驱呈现只有左孩子或者没有孩子的状况,以后节点还有孩子 isComplete = false; } } else if (t->left == nullptr && t->right == nullptr){ // 没有孩子 noChildren = true; } else if(t->left != nullptr && t->right == nullptr){ // 只有左孩子 onlyLeft = true; } }}int main() { scanf("%d", &n); int data[n]; for (int i = 0; i < n; ++i) { scanf("%d", &data[i]); } Node *root = createTree(data); layerOrder(root); if (isComplete) { printf("YES"); } else { printf("NO"); } return 0;}