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;
}
相关推荐
To_OC10 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
刘马想放假21 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
05Kevin1 天前
lk每日冒险题--数据结构6.27
算法
To_OC1 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
北域码匠2 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法