根据序列推出不同二叉树的个数

先序序列为a,b,c,d的不同二叉树的个数是()

A.13                B.14                C.15                D.16

他们有一个卡特兰数公式,就是这么解的:,所以选B


上面为正确答案,下面是我个人的理解,不保证正确:


对这道题我说一下我的理解。

它这个是要确定它的不同的二叉树的个数,所以我们要先了解怎么确定自己画出来的其中一个二叉树算是一个,那么将这些二叉树统计起来就是我们要的答案。

那么怎么确定某个二叉树就算一个呢?

        题目给了我们先序序列,那如果我们有中序序列,就能确定其中一个唯一的二叉树,其实先序序列和中序序列的关系就相当于一种栈的形式:

        先序是【根左右】,把它理解为入栈

        中序是【左根右】,把它理解为出栈

        那么题目说先序序列为a,b,c,d,也就是先序abcd

                                                                  那它入栈后出栈就是dcba,也就是说中序dcba

即:

那么有了前序和中序,其实有多种画法,就我自己琢磨出来的:

        要么是我自己在21年研究出的两种方法来画出其中一种:

                ①ZYT_先序遍历定理_前字母必比后字母平级或更高(能判断左右则不为同级)

                ②ZYT_中序遍历定理_前字母必在后字母左边

        要么就是我24年最近研究出来的:

                你可以前序画【根左///】,中序画【左根///】,这里的///代表:

                        比如说前序的根左右,你画完根左,后面没涉及右,其实只要不打乱根左右的顺序,把最后的右略去也是可以的。即只要不打乱规则顺序,什么根左右还是左根右,最后一个要求(如要求“右”)可以略去。


        回到这幅图,

1.根据先序遍历的根左右,那么根一定是a,于是我们先画一个a,然后我们先序遍历就不用看了。

2.看中序的dcba,根据我的:②ZYT_中序遍历定理_前字母必在后字母左边,那么dcb一定在根节点a的左边,于是我们可以画:

3.再根据②ZYT_中序遍历定理_前字母必在后字母左边,于是中序的dcba中,d一定在cb左边,那么画为:

4.再根据②ZYT_中序遍历定理_前字母必在后字母左边,于是中序的dcba中,c一定在b左边,那么画为:

那画到这,你可能觉得不对,但上面的第2步有说过——那么dcb一定在根节点a的左边,也就是我们这里画的有偏差,调整一下就行,就是无论dcb后面拓展出来怎么画,始终保持它们这部分的队伍始终在根节点a的左边,于是调整为:

这样就是正确的其中一个二叉树啦(也就是把a移右边点,让dcb始终在根节点a的左边)

你看前序abcd【根左右】,那么a就是根节点,正确√,把bcd都理解为它左边的一部分,正确√,这里没有右,理解为把“右”忽略掉,即【根左///】,故前序的顺序我们检验正确

那么检验一下中序dcba【左根右】,这里把dcb都理解为左边的一部分,a为根,右忽略,顺序正确√。

所以这其实只是其中一种情况。我感觉这是我根据进栈和出栈的情况画出来的其中一种而已。其实我也不知正确与否,这只是我个人研究的理解,因为研究不太完善,所以好像也只能画出其中一种。


所以话说回来,答案为了方便就用了卡特兰数公式,即n为进栈的个数,这种计算就方便多了,我们进栈了abcd,那么就是n=4,那么就是:

这其中的原理我就不太知道了,有待以后补充学习。但是有个初步的眉目就是:

【就如我刚才自己画的那个,有了进栈肯定能写出出栈,那么进栈和出栈又和前序及中序相关,换句话说进栈就是前序,出栈就是中序,而有了前序及中序我就能由此推出其中的一棵二叉树,而在这个卡特兰数公式中,n为进栈的个数,也是需要我们提供进栈的信息n才能算出,这里面就有关联在里面了】。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

protobuf

protobuf 简介 概念 protobuf 全称 Protocol buffers,是 Google 研发的一种跨语言、跨平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。 特点 在序列化数据时常用的数据格式还有 XML、JSON 等,相比较而言&#xff0c…

Linux网络编程(二-套接字)

目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…

SqlAlchemy使用教程(五) ORM API 编程入门

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 前一章用SQL表达式(SQL Expr…

Linux miniGUI移植分析

框架介绍 常用GUI程序对比 https://www.cnblogs.com/zyly/p/17378659.html MiniGUI分为底层的GAL(图形抽象层)和IAL(输入抽象层),向上为基于标准POSIX接口中pthread库的Mini-Thread架构和基于Server/Client的Mini-L…

Docker 仓库管理

Docker 仓库管理 仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求…

Android:JNI实战,加载三方库、编译C/C++

一.概述 Android Jni机制让开发者可以在Java端调用到C/C,也是Android应用开发需要掌握的一项重要的基础技能。 计划分两篇博文讲述Jni实战开发。 本篇主要从项目架构上剖析一个Android App如何通过Jni机制加载三方库和C/C文件。 二.Native C Android Studio可…

Java后端sql编写

Java后端sql编写 注意事项二级目录三级目录 注意事项 在后端编写sql,不要直接编写sql语句进行查询 比如直接在service实现类中写下图这种语句 二级目录 三级目录

ubuntu系统(10):使用samba共享linux主机中文件

目录 一、samba安装步骤 1、Linux主机端操作 (1)安装sabma (2)修改samba配置文件 (3)为user_name用户设置samba访问的密码 (4)重启samba服务 2、Windows端 二、使用 1、代码…

全链路压力测试:现代软件工程中的重要性

全链路压力测试不仅可以确保系统在高负载下的性能和稳定性,还能帮助企业进行有效的风险管理和性能优化。在快速发展的互联网时代,全链路压力测试已成为确保软件产品质量的关键步骤。 1、测试环境搭建 测试应在与生产环境尽可能相似的环境中进行&#xff…

如何解决分支机构无法连入总部采购管理系统的难题

案例背景: 某企业业务规模不断壮大,内部采购流程越发复杂,供应商资质情况各异难以管理,为提高内部采购效率和采购品质,优化供应链管理,确保采购环节公正透明可溯,该企业集中化部署了采购管理系…

使用C#操作文件:一个实际案例——替换文件中的IP地址

标题: 使用C#操作文件:一个实际案例——替换文件中的IP地址 介绍: 欢迎阅读我的最新博客!今天,我们将探讨如何使用C#来处理一个实际的编程挑战:读取一个配置文件并替换其中的IP地址。这是一个非常常见的…

Ivanti Connect Secure 曝两大零日漏洞,已被大规模利用

威胁情报公司Volexity发现,影响 Ivanti 的 Connect Secure VPN 和 Policy Secure 网络访问控制 (NAC) 设备的两个零日漏洞正在被大规模利用。自1月11日开始,多个威胁组织在大范围攻击中利用CVE-2023-46805身份验证绕过和CVE-2024-21887命令注入漏洞。 V…