问题 D: DS查找—二叉树平衡因子(不一样的新做法哦)

简介: 问题 D: DS查找—二叉树平衡因子(不一样的新做法哦)

文章目录


题目

问题 D: DS查找—二叉树平衡因子

题目描述

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

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

–程序要求–

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

输入

测试次数t

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

输出

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

样例输入

2

6 ABC00D

24 ABCD0EF0000H00000000000I

样例输出

B 0

D 0

C 1

A -1

D 0

B 1

I 0

H 1

E 2

F 0

C 2

A -2

提示


实现思路

百度出来的代码,千遍一律,都是先建树再求高度,诸如此类的。

但是,我转念一想,为什么做二叉树的就一定要建树,其实有时候题目给的往往就是一颗隐形的二叉树,比如说上面今天这一道题,要是你仔细看的话,一定会发现这个规律

可以发现要求的第i个节点的平衡因子,他的左子树的数组下标为2*i+1, 右子树为2*i+2 ,因此,我们完全可以不重新建树,就可以解出道题。

  • 求深度的思路

利用dfs探到树的叶子节点,再回溯求深度。

代码

#include<iostream>
using namespace std;
int length;
char *p;
int dfs(int i){
    if(i>=length || p[i]=='0')  return 0;
    int l = dfs(2*i+1);  int r = dfs(2*i+2);
    cout<<p[i]<<' '<<l-r<<endl;
    return max(l,r)+1;
}
int main()
{
    int T; cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        length = n;
        p=new char[n];
        for(int i=0;i<n;i++)
            cin>>p[i];
        dfs(0);
        delete []p;
    }
    return 0;
}

附网上常见的该题做法,比对学习

源码链接:

#include <iostream>
using namespace std;
class Bt{
private:
    char *t;        //存输入的信息
    int n;        //长度
    int *le;      //存左子树深度
    int *ri;     //存右子树深度
public:
    Bt(){};
    ~Bt(){};
    void set_Bt();
    void get_balance_factor(int k);
    void out_put();
    void PostOrder(int k);
};
void Bt::out_put()
{
    for(int i=0;i<n;i++)
    {
        cout<<le[i]<<' '<<ri[i]<<endl;
    }
}
void Bt::set_Bt()
{
    cin>>n;
    t=new char[n];
    for(int i=0;i<n;i++)
    {
        cin>>t[i];
    }
    le=new int[n];
    ri=new int[n];
    for(int i=0;i<n;i++)
    {
        le[i]=-1;
        ri[i]=-1;
    }
}
void Bt::get_balance_factor(int k)        //求结点k的左右孩子的深度
{
    int left=k*2+1,right=k*2+2;
    if(left>=n)                        //若左右孩子都不存在,则深度都为0
    {
        le[k]=0;
        ri[k]=0;
    }
    else
    {
        if(t[left]=='0')      //若左孩子不存在,则深度为0
            le[k]=0;
        else
        {
            get_balance_factor(left);     //若左孩子存在,则递归求左孩子的左右子树的深度,然后取大的一个+1作为左子树的深度
            le[k]=le[left]>ri[left] ? le[left]+1:ri[left]+1;
        }
        if(right>=n)
            ri[k]=0;
        else
        {
            if(t[right]=='0')     //若右孩子不存在,则深度为0
                ri[k]=0;
            else
            {
                get_balance_factor(right);     //若右孩子存在,则递归求右孩子的左右子树的深度,然后取大的一个+1作为右子树的深度
                ri[k]=le[right]>ri[right] ? le[right]+1:ri[right]+1;
            }
        }
    }
}
void Bt::PostOrder(int k)        //后序输出平衡因子,平衡因子即为左子树深度减右子树深度
{
    if(k>=n || t[k]=='0')
        return ;
    int left=k*2+1,right=k*2+2;            //取左右孩子的下标
    PostOrder(left);                        //先输出左孩子的平衡因子
    PostOrder(right);                      //后输出右孩子的平衡因子
    cout<<t[k]<<' '<<le[k]-ri[k]<<endl;      //最后输出自己的平衡因子
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        Bt temp;
        temp.set_Bt();
        temp.get_balance_factor(0);
//        temp.out_put();
        temp.PostOrder(0);
    }
}

TO BE continue

相关文章
|
Kubernetes Docker Windows
『阿里云加速』Docker DeskTop安装kubernetes时一直停留在Starting处理方案
📣读完这篇文章里你能收获到 - Docker DeskTop 安装K8S失败处理方案 - Docker 配置镜像加速器 - 数字签名的限制解除
2490 0
『阿里云加速』Docker DeskTop安装kubernetes时一直停留在Starting处理方案
|
7月前
|
机器学习/深度学习 缓存 测试技术
LongCat-Flash-Thinking 正式发布,更强、更专业,保持极速!
LongCat-Flash-Thinking 正式发布,更强、更专业,保持极速!
271 0
|
8月前
|
人工智能 IDE 前端开发
云开发CloudBase 实现五子棋在线小游戏
本文介绍了使用腾讯云CloudBase和CodeBuddy IDE开发在线对战五子棋小游戏的过程。作者通过本地工具配置CloudBase AI ToolKit,尝试创建云函数和使用云数据库存储游戏数据,但在云函数部分遇到困难。随后改用CodeBuddy IDE进行开发,利用其AI全栈能力实现从需求规划、代码开发到部署的全流程。开发过程中遇到云函数异常、前端交互问题等,通过AI对话式调试(截图、日志分析)高效修复,最终实现支持实时对战、房间管理、胜负判定等功能的双端适配五子棋游戏,并成功部署上线。
366 0
|
9月前
|
机器学习/深度学习 人工智能 PyTorch
当量子力学遇上人工智能:科幻照进现实了吗?
当量子力学遇上人工智能:科幻照进现实了吗?
359 0
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
1133 119
|
机器学习/深度学习 搜索推荐 算法
推荐系统的算法与实现:深入解析与实践
【6月更文挑战第14天】本文深入探讨了推荐系统的原理与实现,包括用户和项目建模、协同过滤、内容过滤及混合推荐算法。通过收集用户行为数据,系统预测用户兴趣,提供个性化推荐。实践中,涉及数据处理、建模、算法选择及结果优化。随着技术发展,推荐系统将持续改进,提升性能和用户体验。
1883 3
|
Java 测试技术 数据处理
Java零基础教学(17):Java运算符详解
【8月更文挑战第17天】Java零基础教学篇,手把手实践教学!
353 4
|
Java 调度 流计算
基于多线程的方式优化 FLink 程序
这篇内容介绍了线程的基本概念和重要性。线程是程序执行的最小单位,比进程更细粒度,常用于提高程序响应性和性能。多线程可以实现并发处理,利用多核处理器,实现资源共享和复杂逻辑。文章还讨论了线程的五种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED)以及如何在Java中创建和停止线程。最后提到了两种停止线程的方法:使用标识和中断机制。
577 5
|
分布式计算 Java API
Java 8新特性详解:流处理与函数式编程
【4月更文挑战第2天】Java 8引入了流处理和函数式编程,革新了数据处理。流提供声明式处理,简化集合操作,利用filter、map等方法实现高效逻辑。Lambda表达式支持匿名函数,简化接口实现,配合函数式接口如Predicate和Function,增强代码简洁性。Optional类处理可能为空的值,防止空指针异常。新日期时间API和并行流进一步强化了函数式编程。这些特性提升了Java的效率和可读性,助力开发更优质的应用。
235 0
|
数据采集 数据处理 异构计算
ZYNQ(FPGA)与DSP之间SRIO通信实现
XQ6657Z35-EVM多核开发板通过SPI、EMIF16、uPP、SRIO 通信接口将DSP 与Zynq 结合在一起,组成DSP+Zynq 架构,实现了需求独特、灵活、功能强大的DSP+Zynq 高速数据采集处理系统。
ZYNQ(FPGA)与DSP之间SRIO通信实现