题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
输入描述:
第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。 以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理) ps:节点的标号就是节点的值输出描述:
第一行输出该二叉树是否为搜索二叉树的答案,如果是则输出 "true",否则输出 "false"。 第二行输出该二叉树是否为完全二叉树的答案,如果是则输出 "true",否则输出 "false"。示例1
输入
复制
3 2 2 1 3 1 0 0 3 0 0输出
复制
true true备注:
1≤n≤500000 1≤fa,lch,rch,root≤n
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int value):val(value), left(nullptr), right(nullptr) {}
};
void createTree(TreeNode* root, int& cnt) {
if(cnt == 0) return;
int fa, lch, rch;
cin >> fa >> lch >> rch;
if(lch) {
TreeNode* l = new TreeNode(lch);
root->left = l;
createTree(root->left, -- cnt);
}
if(rch) {
TreeNode* r = new TreeNode(rch);
root->right = r;
createTree(root->right, -- cnt);
}
}
bool isBST(TreeNode* root) {
if(!root) return true;
stack<TreeNode*> treeStack;
TreeNode* cur = root;
vector<int> vec;
while(cur || !treeStack.empty()) {
while(cur) {
treeStack.push(cur);
cur = cur->left;
}
cur = treeStack.top();
treeStack.pop();
vec.push_back(cur->val);
cur = cur->right;
}
for(int i = 0; i < vec.size() - 1; i ++) {
if(vec[i] >= vec[i + 1]) {
return false;
}
}
return true;
}
bool isCBT(TreeNode* root) {
if(!root) return true;
TreeNode* cur = root;
queue<TreeNode*> treeQueue;
TreeNode* l = nullptr;
TreeNode* r = nullptr;
bool leaf = false;
treeQueue.push(cur);
while(!treeQueue.empty()) {
cur = treeQueue.front();
treeQueue.pop();
l = cur->left;
r = cur->right;
if((leaf && (l != nullptr || r != nullptr)) || l == nullptr && r != nullptr) {
return false;
}
if(l != nullptr) {
treeQueue.push(l);
}
if(r != nullptr) {
treeQueue.push(r);
} else {
leaf = true;
}
}
return true;
}
int main() {
int n, r;
cin >> n >> r;
TreeNode* root = new TreeNode(r);
createTree(root, n);
if(isBST(root)) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
if(isCBT(root)) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
return 0;
}