完全二叉树判断
【问题描述】给出一棵二叉树的结构,判断这棵二叉树是不是完全二叉树。必须使用二叉树类实现。
【输入形式】
输入文件一共包含N+1行。
第一行含有一个正整数N,代表树中结点总数。
其余N行按顺序描述第1,2,……,N个结点的左右子节点编号。其中第i行的二个整数Pi,Qi,代表结点i结点i的左孩子为Pi,右孩子为Qi。若Pi=0,则表明结点i没有左孩子。同样的,若Qi=0,则表明没有右孩子。(第i行指的是这N行中的第i行)
【输出形式】
如果给出的树是完全二叉树,则输出’Y’,否则输出’N’。(均不包含引号)
【样例输入1】
4
0 0
0 0
1 0
3 2
【样例输出】
Y
【样例输入2】
4
0 0
0 0
0 1
3 2
【样例输出2】
N
【样例说明】
对于所有的数据,均满足1<=N<=100000
对于所有的数据,均满足0<=Pi,Qi<=N
对于所有的数据,均保证给出的是一棵二叉树
我的:
#include <iostream>
#include <cmath>
using namespace std;
template<class T>
class binaryTree
{
private:
struct Node {
T data;
Node* left, * right;
Node() :left(NULL), right(NULL) {}
Node(T item, Node* L = NULL, Node* R = NULL) :data(item), left(L), right(R) {}
~Node() {}
};
int N;
Node** root;
public:
binaryTree() :root(NULL),N(0) {}
binaryTree(T x, int n) { root = new Node(x); N = n; }
~binaryTree();
bool isComplete(int n)const;
void creatTree(int n, T flag);
private:
void clear(Node*& t);
int height(Node* t)const;
int size(Node* t)const;
};
template<class T>
void binaryTree<T>::clear(binaryTree<T>::Node*& t)
{
if (t == NULL) return;
clear(t->left);
clear(t->right);
delete t;
t = NULL;
}
template<class T>
binaryTree<T>::~binaryTree()
{
for (int i = 0; i <= N; ++i)
delete root[i];
}
template<class T>
int binaryTree<T>::size(binaryTree<T>::Node* t)const
{
if (t == NULL) return 0;
int s = 1 + size(t->left) + size(t->right);
return s;
}
template<class T>
int binaryTree<T>::height(binaryTree<T>::Node* t)const
{
if (t == NULL) return 0;
else {
int lt = height(t->left), rt = height(t->right);
int h = 1 + ((lt > rt) ? lt : rt);
return h;
}
}
template<class T>
void binaryTree<T>::creatTree(int n, T flag)
{
N = n;
Node **p = NULL;
T ldata, rdata;
p = new Node*[n + 1];
root = p;
for (int i = 0; i < n + 1; ++i)
p[i] = NULL;
for (int i = 1; i <= n; ++i) {
p[i] = new Node(i);
}
for (int i = 1; i <= n; ++i) {
cin >> ldata >> rdata;
if (ldata != flag) p[i]->left = p[ldata];
if (rdata != flag) p[i]->right = p[rdata];
}
}
template<class T>
bool binaryTree<T>::isComplete(int n)const
{
for (int i = 1; i < n + 1; ++i) {
int hl = height(root[i]->left);
int hr = height(root[i]->right);
int sl = size(root[i]->left);
int sr = size(root[i]->right);
if (root[i]->left == 0 && root[i]->right == 0) continue;
if (hl < hr) {return false; }
else if (hl == hr) {
if (sl != pow(2, hl) - 1) {return false; }
}
else if (hl == hr + 1) {
if (root[i]->right != NULL && sr != pow(2,hr) - 1) { return false; }
}
else {return false; }
}
return true;
}
int main()
{
binaryTree<int> tree;
int n;
cin >> n;
tree.creatTree(n, 0);
if (tree.isComplete(n))
cout << 'Y' << endl;
else
cout << 'N' << endl;
return 0;
}