题目地址
考了二叉平衡树,完全二叉树的判断,树的遍历,其中二叉平衡树写起来比较麻烦。
创建一个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;
}