思路
这道题就是板子题+完全二叉树的缝合。
直接沿用判断完全二叉树的方法即可。
代码
#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode * left, * right;
TreeNode(int v):val(v), left(nullptr), right(nullptr){};
};
int getHeight(TreeNode * root) {
if(!root)
return 0;
return max(getHeight(root->left), getHeight(root->right)) + 1;
}
TreeNode * rightRotate(TreeNode * root) {
auto node = root->left;
root->left = node->right;
node->right = root;
return node;
}
TreeNode * leftRotate(TreeNode * root) {
auto node = root->right;
root->right = node->left;
node->left = root;
return node;
}
TreeNode * leftRightRotate(TreeNode * root) {
root->left = leftRotate(root->left);
return rightRotate(root);
}
TreeNode * rightLeftRotate(TreeNode * root) {
root->right = rightRotate(root->right);
return leftRotate(root);
}
TreeNode * insert(TreeNode * root, int val) {
if(!root) {
root = new TreeNode(val);
} else if(root->val > val) {
root->left = insert(root->left, val);
int l = getHeight(root->left);
int r = getHeight(root->right);
if(l - r > 1) {
if(val < root->left->val) {
root = rightRotate(root);
} else {
root = leftRightRotate(root);
}
}
} else {
root->right = insert(root->right, val);
int l = getHeight(root->left);
int r = getHeight(root->right);
if(r - l > 1) {
if(val > root->right->val) {
root = leftRotate(root);
} else {
root = rightLeftRotate(root);
}
}
}
return root;
}
int n;
void levelOrder(TreeNode * root) {
queue<TreeNode*> q;
q.push(root);
printf("%d", root->val);
int n_rest = n;
bool flag = true;
while(! q.empty()) {
auto node = q.front();
q.pop();
if(! node) {
if(n_rest == 0)
break;
flag = false;
} else {
--n_rest;
if(node != root)
printf(" %d", node->val);
q.push(node->left);
q.push(node->right);
}
}
if(!flag)
printf("\nNO\n");
else
printf("\nYES\n");
}
int main() {
cin >> n;
TreeNode * root = nullptr;
for(int i = 0; i < n; ++i) {
int val;
cin >> val;
root = insert(root, val);
assert(root);
}
levelOrder(root);
}