树转二叉树(有序树转换为二叉树)讲解

2023-10-27

1006: 树转二叉树

Description
输入一颗普通有序树,将它转换为对应的二叉链表存储,然后输出该二叉树的先序和后序遍历序列。

Input
包含多组测试数据。

每组测试数据第1行为树的结点个数n(1≤n≤26)。

接下来包含n行,其中第i行(1≤i≤n)的数据依次为结点i的数据值ai(为一个小写字母),后面各元素为结点i的儿子序号,以0结束。若ai后仅含一个0,则表示结点i为叶子节点。

Output
输出包含2行,第一行为先序遍历序列,第二行为后序遍历序列。

Sample Input
18
r 2 3 4 0
a 5 6 0
b 7 0
c 8 9 10 0
w 0
x 11 12 0
f 0
s 13 14 0
t 0
u 0
d 15 0
e 0
i 16 17 18 0
j 0
h 0
m 0
o 0
n 0

Sample Output
rawxdhebfcsimonjtu
hedxwfnomjiutscbar
————————————————————————————————————————————
●首先得理解题意啊!!
1.什么是有序树
有序树即:每棵树的子树都按照从左到右的顺序依次排列,不会出现没有左侧的子树而有右侧子树的情况。
2.堂兄弟
即同一父亲下的所有子树
3.理解如何将有序树转换为二叉树
基本方法大家可能在网上看到过,如下:

在这里插入图片描述

解题思路:
●掌握基本的树转换为二叉树的方法。

●找出根节点,构建普通树。因为该题并没有告诉根节点所在,所以首要目的是找出根节点,然后再构建普通树。

●先将堂兄弟联系,便于之后转换为二叉树(其实rchild就是用来构建堂兄弟关系的链式结构,lchild用于储存孩子)

●各种遍历输出。


有人曾问我为什么会有这样的转化思路,其实上面有序树的定义也就讲过了,必定是先有左侧的子树,故这种方法必然保留了左侧子树与父亲之间的连线。故对于每一个结点,最多只可能连有左侧子树和堂兄弟的两条边,如此便满足了二叉树定义。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 30;int n;//孩子兄弟表示树
typedef struct TNode{
    char data;
    int parent;
    int lchild;//记录儿子
    int rchild;//记录兄弟
}Tree;
Tree tree[maxn];
void preorder( Tree t[], int tmp)//前序遍历
{
    if( tmp <= 0)return;
    cout<<t[tmp].data;
    preorder(t,t[tmp].lchild);
    preorder(t,t[tmp].rchild);
}
void postorder( Tree t[], int tmp)//中序遍历
{
    if( tmp <= 0)return;
    postorder( t,t[tmp].lchild);
    postorder( t,t[tmp].rchild);
    cout<<t[tmp].data;
}
int main()
{
    while(cin>>n){
        for( int i = 1; i <= n; i++)tree[i].parent = 0;
        for( int i = 1; i <= n; i++){
            getchar();//接受换行符,前面输入了n
            int tmp;
            cin>>tree[i].data>>tmp;//输入字符和数字
            tree[i].lchild = tmp;//lchild指向第一个节点 0为空 即本身为根节点,转换后只有左边的孩子保留下来
            int a;
            while( tmp){
                tree[tmp].parent = i;//tmp的双亲为i第i行表示的是节点i的孩子
                cin>>a;//单独判断第一个,如果不为0则可以继续输入,堂兄弟全部作为前面一个的右子树
                tree[tmp].rchild = a;//a为tmp的兄弟;每次换位下一个,将兄弟全部联系在一起
                tmp = a;//每次最后将前一个的tmp重新赋值,同时可以判断是否为零,继续输入
            }
        }
        int tmp = 0;
        for( int i = 1; i <= n; i++){//对输入的n行进行考虑
            if( tree[i].parent == 0){
                tmp = i;//这里找出根节点
                break;
            }
        }
        tree[tmp].rchild = 0;//根节点没有兄弟
        preorder(tree,tmp);cout<<endl;
        postorder(tree,tmp);cout<<endl;
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树转二叉树(有序树转换为二叉树)讲解 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • chrome源代码目录结构简介

    为了对庞大的源码项目进行分析 先对源码目录树作一个简单的介绍 粗略的了解一下各个模块的功能分布情况 chrome源代码src目录下的结构如下图 app 该目录下的代码主要是和各个操作系统平台相关的应用上层代码的提炼 不同操作系统可能对应不同
  • 【DirectX11】第八篇 光照模型——漫反射

    本系列文章主要翻译和参考自 Real Time 3D Rendering with DirectX and HLSL 一书 感谢原书作者 同时会加上一点个人理解和拓展 文章中如有错误 欢迎指正 这里是书中的代码和资源 本文所有的环境和工具使
  • Enscape 出 Mac 版本了,适用于SketchUp 2021免费公测版,附下载地址

    Enscape 宣布推出适用于 Mac 的 Enscape 免费公测版本 这是其流行的实时渲染和虚拟现实插件的新原生 macOS 版本 适用于建筑和 CAD 软件 新版本于上周的Envision 2021用户活动中宣布 将于 2022 年发
  • 高级栈溢出技术—ROP实战(简介及ret2win)

    目录 预备知识 关于ROP 本系列rop实战题目的背景 ret2win涉及知识点 实验目的 实验环境 实验步骤一 实验步骤二 实验步骤三 预备知识 关于ROP ROP的全称为Return oriented programming 返回导向编
  • MySQL学习笔记1(详细版)

    这是在学习MySQL时 根据视频所讲记录的笔记 写这篇文章的主要目的是加深下自己的印象 目录 一 MySQL启动与停止 二 MySQL常见命令 三 MySQL基础 四 结尾 一 MySQL启动与停止 1 在CMD窗口中启动和停止MySQL服
  • vue异步加载amap高德地图,解决刷新浏览器地图不显示问题

    创建amap js 异步创建script标签 export default function MapLoader return new Promise resolve reject gt if window AMap resolve win
  • GJB1188A校验和代码

    GJB1188A校验和代码 GJB1188A校验和算法的步骤 先拼接为一个字 16字节 然后循环移位之后 模2算法合成 按位异或 就是 运算符 之后再反向移位 具体算法要求如图 unsigned short int crc unsigned
  • navicat(MySql)错误1045 Access denied for user 'root'@'localhost' (using password:YES)

    新电脑装mysql navicat 后 打开navicat提示错误如题目 可能是某种原因root密码记错了 在网上找了一些方法 结合自己的实践 总结如下 1 开始菜单里 搜索cmd 右击 以管理员身份运行控制台 停止mysql服务 输入 n
  • 架构基本概念和架构本质

    什么是架构和架构本质 在软件行业 对于什么是架构 都有很多的争论 每个人都有自己的理解 此君说的架构和彼君理解的架构未必是一回事 因此我们在讨论架构之前 我们先讨论架构的概念定义 概念是人认识这个世界的基础 并用来沟通的手段 如果对架构概念
  • 二分查找、第一个错误的版本、搜索插入位置

    Java学习路线 Java学习路线总结 搬砖工逆袭Java架构师 简介 CSDN2021博客之星亚军 博客专家 公众号 哪吒编程 维护者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 目录 1 LeetCode 7
  • 【满分】【华为OD机试真题2023 JAVA&JS】递增字符串

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 递增字符串 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 定义字符串完全由 A 和 B 组成 当然也可以全是 A 或全是 B 如果字符串从前往后都是以字典序排列
  • 【网安】处理项目中的一些常见漏洞bug(java相关)

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 https mp weixin qq com s BWb9OzaB gVGVpkm161PMw 1 写在前面 很多时候 一些项目 或许都会有一定的系统安全要求 一般常见于政府
  • 操作系统期末复习

    操作系统实例5个 windows linux unix macOS Chrome OS 类Unix Linux系 Linux Ubuntu CentOS Debian RedHat Unix macOS FreeBSD OpenBSD wi
  • Error Creating bean with name

    错误类型 Error Creating bean with name 错误详情 org springframework beans factory UnsatisfiedDependencyException Error creating
  • 《Autotools - GNU Autoconf, Automake与Libtool实践者指南》第三章

    https blog csdn net abcd1f2 article details 48827427 因为对于原本的Autoconf框架 Automake和Libtool本质上是追加的组件 花费一些时间使用Autoconf而不使用Aut
  • 关于通视域分析和日照分析

    1 通视域分析可以转换为区域为多边形的日照分析 2 该日照分析需要用shadowmap修正 3 该多边形由model cliper类和model clipperEx类获取裁剪内的物体集合
  • ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘ (using password YES/NO)

    问题描述 在使用命令行登录 MySQL 时出现了下述问题 或 ERROR 1045 28000 Access denied for user root localhost using password NO 出错原因 using passw
  • JavaScript中的常用浏览器对象

    JavaScript中的浏览器对象 window对象 window对象指的是浏览器的当前窗口 学习过JavaScript的人肯定对document不陌生 只要使用DOM操作 document一定少不了 其实document是浏览器属性win
  • DBN(深度置信网络)

    具有层次结构的数学算法 神经网络 到 深度神经网络DNN 限制深度波尔茨曼机 到 深度波尔茨曼机DBM 限制深度波尔茨曼机 到 深度置信网络DBN 还有其它的方法 鉴于鄙人才疏学浅 暂以偏概全 4 1深度神经网络 Deep neural n
  • 树转二叉树(有序树转换为二叉树)讲解

    1006 树转二叉树 Description 输入一颗普通有序树 将它转换为对应的二叉链表存储 然后输出该二叉树的先序和后序遍历序列 Input 包含多组测试数据 每组测试数据第1行为树的结点个数n 1 n 26 接下来包含n行 其中第i行