输出具有n个结点的所有不同的二叉树-增强前序遍历形式输出-C++

2023-11-13

        我们知道具有n个结点的不同的二叉树的数量是\frac{\binom{n}{2n}}{n+1}个(这是一个卡塔兰数),那么如何确定这些二叉树是什么样子的呢?下面是博主的思路:

        我们还知道一个入栈序列的不同出栈序列的数量也是\frac{\binom{n}{2n}}{n+1}个,于是博主就想:这不是巧了么,既然他们的数量是一样的,而且均不相同,那么是不是可以构建一个映射,使得不同的出栈序列和不同的二叉树进行一一对应呢。

        于是,在博主的做了深入的观察和思考后,发现对于其中一个出栈序列,其实和某个二叉树的中序遍历结果是相对应的,而经过进一步探索,发现入栈序列是所有二叉树的前序遍历结果。

        众所周知,一个二叉树的前序和中序遍历结果是可以唯一确定一棵二叉树的。

        然而在写代码的过程中博主又遇到了一个难题:就是如何输出一个入栈序列的全部出栈序列呢?为了解决这个问题,博主上某搜索网站参考了各位大神的代码,发现他们基本都是用回溯法解决的。于是在一番研究之下。我成功地写出了输出一个入栈序列的全部出栈序列的函数。

        这样一来,所有问题都解决了。然后经过了20分钟的编码。博主成功地写出了求解具有n个结点的不同的二叉树的所有前序增强序列的C++代码:

        另外如果大家有什么疑问或者见解可以在评论下方讨论,如果发现确实有什么错误的话,还请指正。

如下所示:

#include <iostream>

using namespace std;

static const int M = 100;
//依次代表的意思是结点数、栈、出栈序列、栈指针、出栈序列大小、输入顺序、二叉树中序序列,二叉树中序序列索引
static int n,stk[M],seq[M],stk_top=-1,seq_size=0,input[M],in[M],idx;

//根据二叉树的前序和中序遍历获取增强前序序列
static void getEnhencedPreorder(int root, int begin, int end) {
	if (begin > end) {
		cout << "#" << " ";
		return;
	}
	int i = begin;
	while (input[root] != in[i]) {
		i++;
	}
	cout << input[root] << " ";
	getEnhencedPreorder(root + 1, begin, i - 1);
	getEnhencedPreorder(root + (i - begin) + 1, i + 1, end);
}

//获取所有出栈序列
static void getSequence(int i) {
	if (i == n) {
		//收集结果
		idx = 0;
		for (int i = 0; i < seq_size; i++) {
			in[idx++]=seq[i];
		}
		for (int i = stk_top; i >= 0; i--) {
			in[idx++] = stk[i];
		}
		//根据前序和中序遍历获取其增强前序遍历序列
		getEnhencedPreorder(0,0,n-1);
		cout << endl;
	} else {
		//对于一个入栈的元素,可以入栈,也可以不入栈
		//但是每种情况都要检验

		//一、首先是元素入栈了
		stk[++stk_top]= input[i];
		getSequence(i + 1);
		stk_top--;

		//二、然后元素没有入栈,并且栈顶元素出栈了
		if (stk_top!=-1) {
			int top= stk[stk_top--];
			seq[seq_size++]=top;
			getSequence(i);
			seq_size--;
			stk[++stk_top] = top;
		}
	}
}

//相当于main函数
void stack_pop_sequence_re2_main() {
	cin >> n;
	for (int i = 0; i < n;i++) {
		input[i] = i + 1;
	}
	getSequence(0);
}

下面是一个示例(当n取3时):

其入栈序列为1 2 3,输出结果为所有组成的二叉树的前序增强序列('#'号标识空)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输出具有n个结点的所有不同的二叉树-增强前序遍历形式输出-C++ 的相关文章

随机推荐

  • python随机大小写字符串_python 随机产生特定类型字符的函数(大写、小写、数字)...

    1 创建一个 Randomcharacter py 文件 作为模块文件供测试或实现程序调用 内容如下 from random import randint generate a random character between ch1 an
  • 基于51单片机 数控恒流源设计 可调电流源

    设计硬件组成 基于51单片机 数控恒流源设计 可调电流源基于单片机可调电流源设计 项目定制觉得选题不错 分享一下 由51单片机 LCD1602液晶 变压器 整流桥 开关电源LM2596 TLC5615 LM358 TIP31C 按键 TL4
  • ThinkPhp6+Vue前后端分离系统案例

    项目介绍 一款 PHP 语言基于ThinkPhp6 Vue ElementUI等框架精心打造的一款模块化 插件化 高性能的前后端分离架构敏捷开发框架 可用于快速搭建前后端分离后台管理系统 本着简化开发 提升开发效率的初衷 目前框架已集成了完
  • 秒杀linux下系统调用fork()面试题

    秒杀linux下系统调用fork 面试题 第一道题 在之前博客也写过这道题 http blog csdn net chdhust article details 8535915 题目 请问下面的程序一共输出多少个 1 2 3 4 5 6
  • 华为前副总裁李玉琢:华为无法培养出企业家

    1995年我刚进入华为不久 有人问我四通与华为的区别时 我脱口而出 四通能培养企业家而华为不能 这一点从任正非迟迟无法找到自己的 替手 就可见一斑 曾国藩说 做大事者 以寻找替手为第一要义 任正非也并非不知道这些道理 但是他的某些意识以及管
  • vscode配置C/C++环境(Windows)

    1 总体流程 2 下载CodeBlocks 下载该CodeBlocks的主要目的是为了使用其自带的MinGW 对于初学者在配置环境这步会少遇到一些坑 下载网址 http www codeblocks org downloads binari
  • 2017校园招聘腾讯笔试题 在线编程题

    2 二分查找 90 90 如果输入80 80 在0到90之间 记为1 继续二分 80在 45 90 之间 记为1 最后应该输出为111100 则输出111100 Java代码如下 import java util Scanner publi
  • SSM 使用C3P0 数据库连接池 提示如下错误信息:Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()Z

    产生上述问题的原因是 c3p0 jar版本过低 我用的是 c3p0 0 9 1 2 jar 解决办法 c3p0 0 9 1 2 jar 换成 c3p0 0 9 5 2 jar
  • 路由器、交换机、猫(Modem)、LAN、WAN、WLAN、VLAN基本概念

    电脑之间是通过TCP IP协议进行说话的 不同电脑之间准确的找到对方是通过IP地址实现的 不在同一个网络的电脑信息交互是通过网关来实现的 网关就是一个公网地址 由运营商下发的 DHCP服务器下发IP地址 通过DHCP服务端口UDP67和UD
  • 手机屏幕显示正常但是触摸有一部分出问题,是内屏坏了吗?保修期内手机该不该走官方售后?

    这个问题我亲身经历 我现在人就在华为官方售后 根据手机城小哥的说法 现在手机触摸和显示都是一体的 所以如果出现触摸有问题 内屏或者排线等甚至主板都有可能出问题 保修期内手机建议走官方售后 因为有可能不只是屏幕坏了 保修可以同时检查你手机的主
  • 2020-12-24如何在QT中增加函数

    关于如何在QT软件中增加函数的问题 比如在VS中可以这样增加函数 但是在QT中右键并不能如上图一样有这个ADD Member Function 所以应该怎么加呢 如下图所示 1 首先在对应头文件中增加函数声明 如图蓝色区域代码 2 在Sav
  • 关于inet_addr() 函数

    inet addr 将一个字符串格式的ip地址转换成一个uint32 t数字格式 但是需要注意的是 这个函数的返回值在大小端机器上是不同的 例如输入一个 192 168 0 1 的字符串 在内存中的排列 字节从低到高 0xC0 0xA8 0
  • 彻底搞清“SVM”

    文章目录 前言 一 SVM是什么 概述 二 线性SVM 2 1 决策面 方程 2 2 约束条件 以下可以证明 有约束条件和没约束条件的公式是一样的 2 3 线性SVM优化 三 非线性分类 3 1 核函数 总结 前言 分类分析 概念 通过构造
  • 3D点云重建原理及Pytorch实现

    3D点云重建原理及Pytorch实现 Pytorch Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruction 一种Pytorch实现方法 学习
  • maven学习笔记--常用插件(plugins)和目标(goals)

    Maven 的核心其实不做什么实际的事情 除了解析一些 XML 文档 管理生命周期与插件之外 Maven 被设计成将主要的职责委派给一组 Maven 插件 这些插件可以影响 Maven 生命周期 提供对目标的访问 绝大多数 Maven 的动
  • “阿里巴巴官方终极版Java八股文开源,Java学习利器首次揭晓!“

    铜三铁四已经结束了 但还是有很多Java程序员没有找到工作或者成功跳槽 跳槽成功的也只是从一个坑中 跳入另一个坑中 在LZ看来 真正有意义的就业与跳槽 是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的 这件事不容易 但也没有想象的遥
  • Word文档误删怎样恢复?6种实用方法分享给你

    如果您曾经因为没有保存微软Word文档而丢失了所有工作 那么您就会明白疼痛是多么明显 幸运的是 自从在软盘上备份文件的黑暗时代以来 Word已经走过了漫长的道路 如今 如果您丢失了未保存的Word文档 可能仍然有一种方法可以恢复它 这个过程
  • Nodejs学习

    本周我们主要学习了Nodejs相关知识 我也整理了一些相关知识点 首先呢 我们要了解Nodejs不是一门语言 也不是库 不是框架 而是一个JavaScript运行时环境 也就是说它可以解析和执行JavaScript代码 我们知道 浏览器中的
  • ARTS挑战打卡第三周

    ARTS挑战 Algorithm 一周至少一道算法题 Review 阅读并点评至少一篇英文技术文章 Tip 学习至少一个技术技巧 总结和归纳在日常工作中所遇到的知识点 Share 分享一篇有观点和思考的技术文章 01 Algorthm le
  • 输出具有n个结点的所有不同的二叉树-增强前序遍历形式输出-C++

    我们知道具有n个结点的不同的二叉树的数量是个 这是一个卡塔兰数 那么如何确定这些二叉树是什么样子的呢 下面是博主的思路 我们还知道一个入栈序列的不同出栈序列的数量也是个 于是博主就想 这不是巧了么 既然他们的数量是一样的 而且均不相同 那么