E : DS查找—二叉树平衡因子

news2024/9/25 3:17:11

Description

二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用0来表示。

计算二叉树每个结点的平衡因子,并按后序遍历的顺序输出结点的平衡因子。

–程序要求–

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio.h
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求

Input

测试次数t

每组测试数据一行,数组元素个数n,后跟n个字符,二叉树的数组存储。

Output

对每组测试数据,按后序遍历的顺序输出树中结点的平衡因子(测试数据没有空树)

Sample

#0

Input

2
6 ABC00D
24 ABCD0EF0000H00000000000I

Output

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;

// 二叉树结点的定义
struct TreeNode {
    char data;
    int Height;//结点所处的高度
    int balanceFactor;//结点的平衡因子
    TreeNode* left;
    TreeNode* right;
    TreeNode():balanceFactor(0), Height(0), left(nullptr), right(nullptr) {}
    TreeNode(char value) : data(value), Height(0), balanceFactor(0), left(nullptr), right(nullptr) {}
};

// 计算平衡因子
int calculateBalanceFactor(TreeNode* node) {
    //后序遍历的原因,第一个访问的结点高度是0

    //计算左子树高度:若左子树为空,则左树高为0,否则为左树高度+1
    int leftHeight = (node->left == nullptr) ? 0 : node->left->Height + 1;
    //右树相同
    int rightHeight = (node->right == nullptr) ? 0 : node->right->Height + 1;

    //给结点的高度赋值,取左右子树中更大的那个
    if (leftHeight > rightHeight)node->Height = leftHeight;
    else node->Height = rightHeight;

    //最后返回平衡因子的大小
    return leftHeight - rightHeight;
}

// 后序遍历并计算平衡因子
void postOrderTraversal(TreeNode* node) {
    //直接先走到底层
    if (!node ) {
        return;
    }

    // 遍历左子树
    postOrderTraversal(node->left);

    // 遍历右子树
    postOrderTraversal(node->right);

    // 计算当前结点的平衡因子,并输出
    node->balanceFactor = calculateBalanceFactor(node);//平衡因子=左子树高度-右子树高度
    cout << node->data << " " << node->balanceFactor << endl;
}



int main() {
    int t;
    cin >> t;

    for (int i = 0; i < t; ++i) {
        int n;
        cin >> n;

        char* treeArray = new char[n];
        for (int j = 0; j < n; ++j) {
            cin >> treeArray[j];//这里不再用插入的做法进行建树
        }

        // 构建二叉树
        TreeNode* root = nullptr;
        TreeNode* nodes = new TreeNode[n];
        for (int j = 0; j < n; ++j) {
            if (treeArray[j] == '0')continue;//遇到0则过
            nodes[j] = TreeNode(treeArray[j]);//给结点初始化

            //从第二个结点开始分左右建
            if (j > 0) {
                //parent指针记录结点的爹,由于是数组的形式,所以可以用(j-1)/2表示
                int parent = (j - 1) / 2;
                //左孩子是2*k+1,右孩子是2*k+2
                if (j % 2 == 1) {//若余数为1说明是他爹的左孩子
                    nodes[parent].left = &nodes[j];
                }
                else {//否则就是他爹的右儿子
                    nodes[parent].right = &nodes[j];
                }
            }
            else {
                //第一个结点直接扔进去
                root = &nodes[j];
            }
        }
        // 后序遍历并输出平衡因子
        postOrderTraversal(root);

        delete[] treeArray;
        delete[] nodes;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot基于gRPC进行RPC调用

SpringBoot基于gRPC进行RPC调用 一、gRPC1.1 什么是gRPC&#xff1f;1.2 如何编写proto1.3 数据类型及对应关系1.4 枚举1.5 数组1.6 map类型1.7 嵌套对象 二、SpringBoot gRPC2.1 工程目录2.2 jrpc-api2.2.1 引入gRPC依赖2.2.2 编写 .proto 文件2.2.3 使用插件机制生产proto相关…

延迟消息队列的几种实现方案,哪种更适合业务,要看具体情况分析

延迟消息队列的几种实现方案&#xff0c;延迟消息怎么实现&#xff0c;很多人可能一想到的是rabbitmq的死信队列来实现&#xff0c;但是一旦引入mq的话&#xff0c;就依赖这个中间件&#xff0c;另外维护成本&#xff0c;开发成本都很大&#xff0c;那有么有简单点的实现方式呢…

ubuntu推送本地仓库到coding

本教程提供在ubuntu系统下推送本地仓库到coding的指令&#xff0c;用于查阅 一、主要步骤有&#xff1a; 0.初始化仓库 git init 1.添加远程仓库 git remote add origin https://coding.git #修改自己仓库链接 &#xff08;命名仓库别名为origin&#xff09; 2.提交代码…

服务器解析漏洞有哪些?IIS\APACHE\NGINX解析漏洞利用

解析漏洞是指在Web服务器处理用户请求时&#xff0c;对输入数据&#xff08;如文件名、参数等&#xff09;进行解析时产生的漏洞。这种漏洞可能导致服务器对用户提供的数据进行错误解析&#xff0c;使攻击者能够执行未经授权的操作。解析漏洞通常涉及到对用户输入的信任不足&am…

那些令人惊叹的awk简略写法

​​​​​​​awk是一门美妙的语言&#xff0c;被称为unix命令行工具皇冠上的明珠。它有很多简略写法&#xff0c;用好了可以用极少的代码快速解决问题。 下面就列举一些令人惊叹的awk简略写法&#xff1a; awk {sub(/pattern/, "foobar")} 1 # 无论替换是否成功&…

一步步教你创建酒店预订小程序

如果你想为你的酒店或旅馆创建一个预订小程序&#xff0c;这篇文章将为你提供详细的步骤和指南。我们将按照以下顺序进行&#xff1a; 一、进入乔拓云网后台 首先&#xff0c;打开乔拓云网的官方网站&#xff0c;点击右上角的“登录”按钮&#xff0c;登录成功后&#xff0c;点…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

【大数据面试】Flink面试题附答案

目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度&#xff1f; ✅什么是算子链&#xff1f; ✅什么是任务槽&#xff08;Task Slots&#xff09;&#xff1f; ✅任务槽和并行度的关系 ✅Flink作…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

使用Shell脚本监控主机

实验环境 某公司随着业务的不断发展&#xff0c;所使用的Linux服务器也越来越多&#xff0c;管理员希望编写一个简单的性 能监控脚本&#xff0c;放到各服务器中&#xff0c;当监控指标出现异常时发送告警邮件。 需求描述 > 编写名为sysmon.sh的 Shell 监控脚本。 > 监…

《数据结构、算法与应用C++语言描述》- 最小输者树模板的C++实现

输者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_31loserTree 输者树&#xff1a;每一个内部节点所记录的都是比赛的输者&#xff0c;晋级的节点记录在边上。本文中&#xff0c;赢者是分数较低的那个&#xff0c;输者是分数高…

安捷伦Agilent 34970A数据采集

易学易用 从34972A简化的配置到内置的图形Web界面&#xff0c;我们都投入了非常多的时间和精力&#xff0c;以帮助您节约宝贵的时间。一些非常简单的东西,例如模块上螺旋型端子连接器内置热电偶参考结、包括众多实例和提示的完整用户文档&#xff0c;以及使您能够在开机数分钟后…

【C++初阶】学习string类的模拟实现

目录 前言&#xff1a;一、创建文件和类二、实现string类2.1 私有成员和构造函数2.2 析构函数2.3 拷贝构造函数2.3.1 写法12.3.2 写法2 2.4 赋值重载函数2.4.1 写法12.4.2 写法2 2.5 迭代器遍历访问2.6 下标遍历访问2.7 reserve2.8 resize2.9 判空和清理2.10 尾插2.10.1 尾插字…

【mask转json】文件互转

mask图像转json文件 当只有mask图像时&#xff0c;可使用下面代码得到json文件 import cv2 import os import json import sysdef func(file:str) -> dict:png cv2.imread(file)gray cv2.cvtColor(png, cv2.COLOR_BGR2GRAY)_, binary cv2.threshold(gray,10,255,cv2.TH…

在线考试系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.Nodejs、JDK 参考 网盘链接 三.安装运行 1.下载网盘内的软件&#xff0c;并进行安装 2.安装对应的配置文件并进行配置 (1)VsCode 运行 a.新建terminal b.输入命令 npm run dev c.启动成功 (2)Php…

力扣题目学习笔记(OC + Swift) 14. 最长公共前缀

14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 方法一 竖向扫描法 个人感觉纵向扫描方式比较直观&#xff0c;符合人类理解方式&#xff0c;从前往后遍历所有字符串的每一列&#xff0c;比较相同列上的…

通过https协议访问Tomcat部署并使用Shiro认证的应用跳转登到录页时协议变为http的问题

问题描述&#xff1a; 在最近的一个项目中&#xff0c;有一个存在较久&#xff0c;并且只在内部城域网可访问的一个使用Shiro框架进行安全管理的Java应用&#xff0c;该应用部署在Tomcat服务器上。起初&#xff0c;应用程序可以通过HTTP协议访问&#xff0c;一切运行都没…

海外代理IP如何选择?如何避开误区?

近年来&#xff0c;我国互联网商业保持持续发展的状态大环境的优化&#xff0c;大大小小的企业都想乘胜追击&#xff0c;大展宏图&#xff0c;积极推动各项数据业务的进程。 而对于跨境业务来说&#xff0c;代理IP是不可或缺的重要工具之一&#xff0c;市面上代理IP类型众多&a…

基于k6和python进行自动化性能测试

摘要&#xff1a;在性能测试中&#xff0c;达到相应的性能指标对于一个软件来说十分重要&#xff0c;在本文中&#xff0c;将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () {http.get(https://test-api.co…

Java对接腾讯多人音视频房间示例

最近在对接腾讯的多人音视频房间&#xff0c;做一个类似于腾讯会议的工具&#xff0c;至于为什么不直接用腾讯会议&#xff0c;这个我也不知道&#xff0c;当然我也不敢问 首先是腾讯官方的文档地址&#xff1a;https://cloud.tencent.com/document/product/1690 我是后端所以…