题目描述
二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,
一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用0来表示。
计算二叉树每个结点的平衡因子,并按后序遍历的顺序输出结点的平衡因子。–程序要求–
若使用C++只能include一个头文件iostream;
若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求输入
测试次数t 每组测试数据一行,数组元素个数n,后跟n个字符,二叉树的数组存储。
输出
对每组测试数据,按后序遍历的顺序输出树中结点的平衡因子(测试数据没有空树)
样例输入 2 6 ABC00D 24 ABCD0EF0000H00000000000I
样例输出 B 0 D 0 C 1 A -1 D 0 B 1 I 0 H 1 E 2 F 0 C 2 A -2
#include <iostream>
using namespace std;
class Binary_tree
{
private:
int num;
char *tree;
//后续遍历二叉树并计算平衡因子
void PostOrderTraverse(int p)
{
if (tree[p] != '0' && p <= num)
{
PostOrderTraverse(2 * p);
PostOrderTraverse(2 * p + 1);
BalanceFactor(p);
}
}
//某结点平衡因子=该节点左子树的高度-右子树的高度
void BalanceFactor(int p)
{
int temp;
if (2 * p > num)
{
cout << tree[p] << " 0" << endl;
}
else if (2 * p == num && 2 * p + 1 > num)
{
cout << tree[p] << " 1" << endl;
}
else
{
temp = PreOrder(2 * p) - PreOrder(2 * p + 1);
cout << tree[p] << ' ' << temp << endl;
}
}
//操作包装函数
int PreOrder(int p)
{
int depth = 0, maxdepth = 0;
PreOrderTraverse(p, depth, maxdepth);
return maxdepth;
}
//遍历中求树的深度
void PreOrderTraverse(int p, int depth, int &maxdepth)
{
if (tree[p] != '0' && p <= num)
{
depth++;
if (maxdepth < depth)
{
maxdepth = depth;
}
PreOrderTraverse(2 * p, depth, maxdepth);
PreOrderTraverse(2 * p + 1, depth, maxdepth);
}
}
public:
//创建一般二叉树
Binary_tree()
{
cin >> num;
tree = new char[num + 1];
for (int i = 1; i <= num; i++)
{
cin >> tree[i];
}
}
//销毁二叉树
~Binary_tree()
{
delete[] tree;
}
//后序遍历输出结点的平衡因子
void PostOrder()
{
PostOrderTraverse(1);
}
};
int main(void)
{
int t;
cin >> t;
while (t--)
{
Binary_tree bt;
bt.PostOrder();
}
return 0;
}