DS查找—二叉树平衡因子

题目描述

二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,
一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值