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;
}
相关推荐
CoovallyAIHub14 小时前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
NineData15 小时前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
木心月转码ing16 小时前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网18 小时前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱20 小时前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱21 小时前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub2 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github