题目如下:
题目描述
二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用0来表示。
计算二叉树每个结点的平衡因子,并按后序遍历的顺序输出结点的平衡因子。
--程序要求--
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
输入
测试次数t
每组测试数据一行,数组元素个数n,后跟n个字符,二叉树的数组存储。
输出
对每组测试数据,按后序遍历的顺序输出树中结点的平衡因子(测试数据没有空树)
输入样例1
2
6 ABC00D
24 ABCD0EF0000H00000000000I
输出样例1
B 0
D 0
C 1
A -1
D 0
B 1
I 0
H 1
E 2
F 0
C 2
A -2
二叉树用数组构建
在数组中 父亲的下标为pos 则左右子树的下标为2*pos+1和2*pos+2(以0为开头)
如果下标从1开始的 则为2*pos和2*pos+1
node* creattree(int pos)
{
node* t;
if (pos >= len)
{
return nullptr;
}
else
{
if (str[pos] != '0')
{
t = new node;
t->data = str[pos];
t->left = creattree(2 * pos + 1);
t->right = creattree(2 * pos + 2);
}
else
{
t = nullptr;
}
}
pos++;
return t;
}
别忘了pos要++;
另外计算树的深度也是关键:
int height(node* t)
{
int dep1 = 0, dep2 = 0;
if (t == nullptr)
{
return 0;
}
else
{
dep1 = height(t->left);
dep2 = height(t->right);
int max_ = max(dep1, dep2) + 1;
return max_;
}
}
输出:
题目要求要用后序遍历
void show(node* t)
{
if (t)
{
show(t->left);
show(t->right);
cout << t->data << " " << height(t->left) - height(t->right) << endl;
}
else
{
return;
}
}
完整代码如下:
#include <iostream>
using namespace std;
class node
{
public:
char data;
node* left, * right;
node() :data('0'), left(nullptr), right(nullptr) {}
};
class tree
{
public:
node* root;
string str;
int pos;
int len;
tree(string str_)
{
this->str.assign(str_);
this->pos = 0;
this->len = str.length();
this->root = creattree(0);
}
node* creattree(int pos)
{
node* t;
if (pos >= len)
{
return nullptr;
}
else
{
if (str[pos] != '0')
{
t = new node;
t->data = str[pos];
t->left = creattree(2 * pos + 1);
t->right = creattree(2 * pos + 2);
}
else
{
t = nullptr;
}
}
pos++;
return t;
}
void show(node* t)
{
if (t)
{
show(t->left);
show(t->right);
cout << t->data << " " << height(t->left) - height(t->right) << endl;
}
else
{
return;
}
}
int height(node* t)
{
int dep1 = 0, dep2 = 0;
if (t == nullptr)
{
return 0;
}
else
{
dep1 = height(t->left);
dep2 = height(t->right);
int max_ = max(dep1, dep2) + 1;
return max_;
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int index;
cin >> index;
string str;
cin >> str;
tree T(str);
T.show(T.root);
}
return 0;
}