把二叉树转换成树(代码实现)

树、森林与二叉树的转换 树、森林与二叉树的转换 1、树转换为二叉树 由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。 将树转换成二叉树的步骤是: (1)加线。就是在所有兄弟结点之间加一条连线; (2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线; (3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定... 阅读详情

前言:

相信大家都知道二叉树如何转化成树,但是让你用代码实现,却发现自己无从下手。下面我将用代码实现。

思想:

树用二叉树来存储的话,那么类型是“左儿子,右兄弟”。即二叉树某节点和它的左儿子在树中的关系也是父子关系,而与右儿子在树中的关系是兄弟关系。所以现在要把用二叉树存储的树来转变成真正的树型。
想象一下构建二叉树怎么来实现?一般都是先序、中序、后序二叉树。树也类似,但一般都是先序构建二叉树。二叉树的根节点对应着树的根节点,二叉树的左儿子,左儿子的右儿子,左儿子的右儿子的右儿子…等等是该根节点的儿子们。所以我们就根据此特点来把二叉树转变成树。代码其实很简短,有了这个思想就不难写出代码。

代码:

#include<iostream>
#include<vector>
using namespace std;
struct TreeNode{//二叉树的结构 
 	int val;
 	TreeNode* left;
 	TreeNode* right;
 	TreeNode(int n):val(n),left(NULL),right(NULL){}
};
struct Tree{  //树的结构 
 	int val;
 	vector<Tree*> children;
 	Tree(int n):val(n),children(vector<Tree*>()){}
};
TreeNode* create(){ //创建二叉树 
 	int n;
 	cin>>n;
 	if(n==0)  return NULL;
 	TreeNode* root=new TreeNode(n);
 	root->left=create();
 	root->right=create();
	return root; 
}
void print(TreeNode* root)//把二叉树先序输出 
{
 	if(root==NULL) return ;
 	cout<<root->val<<"\t";
 	print(root->left);
 	print(root->right);
}
void print1(Tree* root)//把树先序输出 
{
 	if(root==NULL) return ;
	cout<<root->val<<"\t";
	for(int i=0;i<root->children.size();i++){
  	print1(root->children[i]);
 	}
}
Tree* converse(TreeNode* root)//把二叉树转换为树 
{
 	if(root==NULL) return NULL;
 	Tree* t=new Tree(root->val);
 	vector<Tree*> ve;
 	TreeNode* p=root->left;
 	while(p)
 	{
  		ve.push_back(converse(p));
  		p=p->right;
 	}
 	t->children=ve;
 	return t;
}
void del(TreeNode* root) //删除二叉树 
{
 	if(root==NULL) return;
 	del(root->left);
 	del(root->right);
 	delete root;
}
int main()
{
 	TreeNode* root=NULL;
 	root=create();
 	Tree* t=NULL;
 	t=converse(root);
 	print(root);
 	cout<<endl;
 	print1(t);
 	return 0;
}

结果显示:

在这里插入图片描述

华为OD机试统一考试D卷 - 二叉树计算 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。2行整数,第1行表示二叉树的中序遍历,第2行表示二叉树的前序遍历,以空格分割。1行整数,表示求和树的中序遍历,以空格分割。输出1 -2 0 20 0 6。 阅读详情

相关推荐

滤波器设计实战:Filter Solutions软件从入门到精通

本文是Filter Solutions滤波器设计软件的实战指南,从入门到精通。通过设计一个低通数字滤波器的完整流程,详细讲解了参数设置、FIR/IIR选择、窗函数及逼近函数应用。文章重点介绍了如何利用这款经典工具高效完成滤波器设计、性能权衡,并将设计成果导出至MATLAB等平台进行实际验证与应用,是信号处理工程师提升效率的实用参考。

weixin_29095049的博客 531

二叉树与树的相互转化

二叉树与树的相互转化 树转化为二叉树 加线,在所有兄弟结点之间加线 去线,对树中每个结点只保留与它第一个孩子结点的连线,删除与其他孩子结点之间的连线 其中每个结点左指针指向她的第一个孩子结点,右指针指向他在树中的相邻兄弟结点,由于根节点没有兄弟,因此由树转换而得的二叉树没有右子树 由二叉树转化到树 加线,若该结点存在做孩子,则将该结点与该结点的n个有孩子结点相连(即只要这个结点有左子...

黑胡子大叔的博客 1万+

告别unittest!用Pytest+Fixture重构你的Python测试代码(附实战案例)

本文详细介绍了如何从unittest迁移到Pytest框架,重点解析了Pytest的Fixture机制如何提升测试效率和代码简洁性。通过实战案例展示了Pytest在减少代码量、提升调试效率和资源管理方面的优势,帮助开发者重构Python测试代码。

weixin_26749245的博客 207

树 —— 树与二叉树的转换

树转换为二叉树 (1)加线:在兄弟之间加一连线。 (2)抹线:对每个结点,除了其左孩子外,抹掉其与其余孩子之间的连线。 (3)旋转:将树作适当的旋转即可。 二叉树转换为树 (1)逆旋转:把二叉树从左上到右下分为若干层。如A是一层,B-C-D是一层,E-F-G-H-I-J是一层,然后调整为水平方向。 (2)加线:找到每一层结点在其上一层的父结点。如第三层中,E-F的父结点是B,G的父结...

starter_____的博客 1万+

FDTD Script命令学习-farfield3d/farfieldux/farfielduy

介绍了farfield3d/farfieldux/farfielduy命令功能,及不同应用语法和参数介绍,以及对官网示例进行介绍。

jxxl_1314的博客 3099

二叉树转树(数据结构)(图解)

二叉树转树 从根节点开始,将根节点与右孩子相连的线,以及与根节点的右孩子的右孩子相连的线全部去掉,剩余的转化为二叉树。(只删右侧) 例:将此二叉树转化为对应的树或森林 步骤1:从根节点开始,删除根节点与其右子树的连线,以及右子树与其右子树的连线(只删右侧) 步骤2:将剩余部分转化为二叉树(此过程可见前面的博客《树转二叉树(数据结构)》) ...

weixin_45901312的博客 1万+

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1690

树与二叉树的相互转换

树->二叉树 加线 把相应结点的兄弟结点连线 去线 去掉双亲和非最左边孩子的连线 旋转 二叉树->树 加线-去线 将结点与其左孩子的右孩子及其右子孙连线。然后去掉所有结点与其右孩子的连线。 旋转处理 得到二叉树 #森林->二叉树 先将每棵树转换为二叉树 连接每棵树的根结点 以第一颗树的根作为二叉树的根顺时针旋转 #二叉树->森林 将二叉树的根结点与其右孩子及右子孙的连线全部去掉 对剩下的每一棵孤立的二叉树按照二叉树与树的转换规则转换为树 得

yiranblade的博客 5805

LVGL(lv_table)

LVGL中的lv_table是一个轻量级表格控件,用于显示行列式文本数据。它支持设置单元格内容/样式、行列调整、事件响应等基础功能,适用于参数配置、数据展示等场景。通过API可快速创建表格,设置行列数、填充数据,并自定义对齐方式与样式。但需注意默认无滚动条、行数限制等问题。该控件适合简单表格需求,复杂交互需结合自定义事件处理。

m0_49476241的博客 1266

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 545

树、森林、以及二叉树之间的转化

文章目录树、森林、以及二叉树之间的转化树和二叉树的转换1. 树转换为二叉树2. 二叉树还原为树二叉树转化为树、森林二叉树转化树二叉树转化森林 树、森林、以及二叉树之间的转化 树和二叉树的转换 树和二叉树是两种不同的数据结构,树实现起来比较麻烦,但是树可以转换为二叉树进行处理,处理完以后再从二叉树还原为树。 下面说说转换的方法: 1. 树转换为二叉树 (1) 树中所有相同双亲结点的兄弟结点之间加...

qq_45768871的博客 1605

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5609

C代码实现将一颗树转换成二叉树(给定树)

将树转换成二叉树的方法: 1.加线。在所有的兄弟结点之间加一条线。 2.去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除其他孩子结点之间的连线。 3.调整。以树的根结点为轴心,将整个树调节一下(第一个孩子是结点的左孩子,兄弟转过来的孩子是结点的右孩子) 具体实现过程: 本例规定是一个最多五叉的树(用*next[n]表示,n=5),且给定树的形状,先对该树层序遍历,利用队列实现,每个节点都是从0到4遍历next[i],只要不空,则入队next[i],遍历的序列为ABCDEFGHIJK,

weixin_54452498的博客 3844

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

K:树、二叉树与森林之间的转换及其相关代码实现

相关介绍:  二叉树是树的一种特殊形态,在二叉树中一个节点至多有左、右两个子节点,而在树中一个节点可以包含任意数目的子节点,对于森林,其是多棵树所组成的一个整体,树与树之间彼此相互独立,互不干扰,但其又是一个整体。树与二叉树之间、森林与二叉树之间可以相互的进行转换,且这种转换是一一对应的。树与森林转换成二叉树之后,森林与或树的相关操作都转换为二叉树的操作。在此,将讨论树的存储结构、树与森...

diaosangwan0363的博客 2202

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构(四)树---树的转换

(一)树转二叉树 步骤 1.加线:在所有兄弟结点之间加一条连线 2.去线:对树中每个结点,只保留他与第一个长子结点的连线,删除他与其他孩子结点之间的连线 3.层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使结构层次分明。 注意:第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子 转换后,根节点只有左子树,最左侧链表不改变 (二)森林转二叉...

weixin_30853329的博客 315

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 语言实现二叉树的各种操作

最近重新复习了树的各种操作,包括插入、删除、查找、按层遍历、二叉树转换成双向链表等操作。 尝试用java实现,代码已上传至http://download.youkuaiyun.com/detail/kuanxu/3684419

kuanxu的专栏 650

【数据结构与算法】树的概念及孩子兄弟表示法

树的概念 树是 n 个结点的有限集。 n=0 时称为空树。 有且仅有一个特定的称为根的结点 当 n>1 时,其余节点可分为 m 个不相交的有限集 T1,T2… 强调: n>0时 根节点是唯一的 m>0时 子树个数没有限制,但是一定不会相交。 ...

黄骏捷的博客 1815

[LintCode 453] 将二叉树拆成链表(Python)

题目描述 将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。 注意事项 不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。 思路递归实现。将左右子数连接起来,我们需要得到每棵子树的头节点和尾节点。头节点就是根节点。尾节点依次可能是右子树的尾结点(若右子树不空),左子树的尾结点(若左子树

yurenguowang的博客 887

数据结构(C语言)树的存储结构

树的存储结构 1、双亲表示法 实现 :定义结构数组,存放树的结点,每个结点包含两个域: 数据域 :存放结点本身信息 双亲域 :指示本结点的双亲结点在数组中的位置 存储结构 数组下标 data parent 0 R -1 1 A 0 2 B 0 3 C 0 4 D 1 5 E 1 6 F 3 7 H 6 8 H 6 9 K 6 特点:找双亲容易,找孩子难 代码实现 typedef struct PTNode { TElemType data

AtomQQ_2022313691的博客 2116

2017 年数据结构统考真题

2017 年408统考真题设计算法

零小唬的博客 706

二叉树与树、森林之间的转换

一、森林、树转换成二叉树   树转化成二叉树的步骤: 树中所有相邻兄弟结点之间加一条线 对树中的每个结点只保留它与长子之间的连线,删除与其他孩子之间的连线 以树的根结点为轴心,将整棵树顺时针转动,使之结构层次分明 图例:   森林转化成二叉树的步骤: 将森林中的每棵树转化成相应的二叉树 第一颗二叉树不动,从第二颗树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子...

墩儿还是菜鸡 6万+

实现一般树转换成二叉树

1 需求分析 1.1 课题功能需求分析 (1) 设计内容: a、建立一棵树; b、将树转换成二叉树; c、实现二叉树的前序、中序、后序的递归和非递归遍历算法。 (2) 设计要求: a、符合课题要求,实现树与二叉树的转换 1.2 课题开发工具及环境分析 使用VC++6.0工具 1.3 课题相关数据结构原理分析 树和二叉树不同,可以有0-n个孩子,该程序设计中,借助树的孩子兄弟表示法吧树转...

LJY16699的博客 5434

森林转换成二叉树和二叉树转换成森林的递归算法。

C语言森林转换成二叉树和二叉树转换成森林等的递归算法。 假定普通树采用定长结点结构,而二叉树采用二叉链表结构 (1) 树转换成二叉树的算法: (i) 将原树的根结点转换为二叉树的根结点; (ii) 将原树根结点的所有子树按顺序逐一的转换为二叉树,将第一棵二叉树 作为二叉树根结点的左子树,后一棵二叉树做为前一棵二叉树的根结点 的右子树。 代码: #define MAX_DEGREE 10 //结点...

weixin_44352058的博客 2951

树、森林与二叉树的相互转换

文章目录树转换为二叉树 树转换为二叉树  二叉树和树都可以用二叉链表作为存储结构,因此二叉链表可以导出树与二叉树的一个对应关系,即给定一棵树,可以找到唯一的一棵二叉树与之对应。其中树的二叉链表存储详情可参照树的存储结构及详细完整代码。  树转换成二叉树的规则:  <1>每个结点的左指针指向它的第一个孩子结点;  <2>每个结点的右指针指向它在树中的相邻兄弟结点。  可表示为"左孩子右兄弟"。 ...

薛定谔的猫的博客 2万+

C语言:树与二叉树的转换

原理:天勤高分笔记P155-P158 树输入的文本形式:AB0CE0F00D000 cstree cstree1:AB0C0D000 cstree2:EF000 cstree3:GH0IJ0000 cstree1,2,3 #include <stdio.h> #include <stdlib.h> #define maxSize 100 /...

Read by heart 8873
上一篇: 关于某种二叉树的生成
下一篇: 浅谈STL中的map
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值