DS查找—二叉树平衡因子

题目描述

二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用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

AC代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

struct TreeNode {//树的节点
    char value;//当前的值
    int leftHeight;//左边的高度
    int rightHeight;//右边的高度
    int balanceFactor;//平衡因子
};

int calculateHeight(vector<TreeNode>& tree, int index) {//传入整个树节点数组
    if (index >= tree.size() || tree[index].value == '0') {
        return 0;  // 空节点高度为0
    }
    // 计算左子树和右子树的高度
    int leftHeight = calculateHeight(tree, 2 * index + 1);
    int rightHeight = calculateHeight(tree, 2 * index + 2);
    // 更新当前节点的高度和左右子树的高度
    tree[index].leftHeight = leftHeight;
    tree[index].rightHeight = rightHeight;
    tree[index].balanceFactor = leftHeight - rightHeight;
    return max(leftHeight, rightHeight) + 1;  // 返回当前节点的高度
}

void postOrderTraversal(const vector<TreeNode>& tree, int index, vector<string>& result) {
    if (index >= tree.size() || tree[index].value == '0') {
        return;//等于0的话就不push进去了,所以看不到0 0.
    }
    // 先递归遍历左子树,再右子树,最后处理当前节点
    postOrderTraversal(tree, 2 * index + 1, result);
    postOrderTraversal(tree, 2 * index + 2, result);

    result.push_back(string(1, tree[index].value) + " " + to_string(tree[index].balanceFactor));//string(1,tree。。。。)固定搭配,意思为形成一个一个长度的字符串。
}

int main() {
    int t;  // 测试次数
    cin >> t;

    while (t--) {
        int n;
        cin >> n;

        string treeData;//读取字符串
        cin >> treeData;

        vector<TreeNode> tree(n);//几个树的节点
        for (int i = 0; i < n; ++i) {
            tree[i].value = treeData[i];//每个都相应的赋值
        }

        // 计算每个节点的平衡因子
        calculateHeight(tree, 0);

        // 存储后序遍历的结果
        vector<string> result;
        postOrderTraversal(tree, 0, result);//后续遍历,从底部到顶部

        // 输出结果
        for (const string& res : result) {
            cout << res << endl;//循环输出结果
        }
    }

    return 0;
}
相关推荐
2601_956121972 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc3 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
兴通物联科技4 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
月华路6 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
我想走路带风6 小时前
LRU和最长前缀和(计算机网络算法)
计算机网络·算法
M78佐菲6 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
ShineWinsu7 小时前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
徐小夕8 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
张张的快乐时光呀!8 小时前
记录使用 MFC 打开文件对话框读取一张图片并做简单的灰度转换算法简单学习过程
c++·mfc