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;
}
相关推荐
方方洛10 分钟前
vllm教程-02-核心原理
人工智能·算法·vllm
张小姐的猫14 分钟前
【C++开发脚手架】 —— Jsoncpp上手
java·linux·开发语言·网络·c++·tcp/ip·udp
OPEN-F23 分钟前
C++并发编程:异步任务与线程池实战
开发语言·c++·算法
SelectDB技术团队32 分钟前
统一全文检索与 SQL 分析:Apache Doris 日志分析实践
大数据·数据结构·后端·python·全文检索·doris·日志分析
凉茶钱40 分钟前
【数据结构】计数排序
数据结构·算法·排序算法
水饺编程2 小时前
第5章,[Win32 章节] :练习程序,BigFontPic
c语言·c++·windows·visual studio
dtq04243 小时前
数据结构 - 线性表 - 双向链表
c语言·数据结构·学习
不正经学生6 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥9 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲9 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法