DS树结构转换(先序转双亲)

题目描述

给出一棵二叉树的特定字符先序遍历结果(空子树用字符'#'表示),构建该二叉树,并输出该二叉树的双亲表示法结果

双亲表示法的数组下标从0开始,根结点必定是在下标0元素,且根结点的双亲下标为-1,左右孩子按下标递增顺序排列,

结点下标是层次遍历顺序。

输入

第一个输入t,表示有t棵二叉树

接着t行,每行输入含特定字符的二叉树先序遍历序列

输出

共输出2t行

每棵二叉树输出两行,第一行输出各个结点的数值,第二行输出各结点的双亲下标

输入样例1

3
AB#C##D##
ABD##E##C##
AB##CDW###E#F##

输出样例1

A B D C
-1 0 0 1
A B C D E
-1 0 0 1 1
A B C D E W F
-1 0 0 2 2 3 4

NOTICE:这个题只要在原来二叉树的算法基础上加个双亲指针parent就可以,然后借助层次遍历来创建双亲表示法下的树的存储结构;(有一个地方没搞懂,就是参数为什么要引用?我单步调试了一下,发现不用引用的话根结点是空的,也就是根本就没有创建?)

#include <iostream>
#include <queue>
using namespace std;

class BiTreeNode
{
private:
	char data;
	BiTreeNode* lchild;
	BiTreeNode* rchild;
	BiTreeNode* parent;
public:
	BiTreeNode():data(' '),lchild(nullptr),rchild(nullptr),parent(nullptr) {}
	friend class BiTree;
};

class BiTree
{
private:
	BiTreeNode* root;
	//根据题目要求定义的新的属性
	BiTreeNode* a[1000];//这里非常关键,数组存储的是指针而非数据,方便find函数
	int b[1000];//双亲下标
	int len;//两个数组的长度

	void Create(BiTreeNode* &t,BiTreeNode* par)//指针传引用???
	{
		char ch;
		cin >> ch;
		if (ch != '#')
		{
			t = new BiTreeNode;
			t->data = ch;
			t->parent = par;
			Create(t->lchild, t);
			Create(t->rchild, t);
		}
		else
			t = nullptr;
	}
	int find(BiTreeNode* t)//根据传过来的双亲指针,找到对应的双亲下标
	{
		if (t == nullptr)
			return -1;

		for (int i = 0; i < 1000; i++)
		{
			if (t == a[i])
				return i;
		}
	}
public:
	void Create()
	{
		Create(root, nullptr);
	}
	void BFS()
	{
		queue<BiTreeNode*> q;
		int index = 0;//数组a的下标
		if (root != nullptr)
		{
			q.push(root);
			while (!q.empty())
			{
				a[index] = q.front();
				b[index] = find(q.front()->parent);
				index++;

				if (q.front()->lchild != nullptr)
					q.push(q.front()->lchild);
				if (q.front()->rchild != nullptr)
					q.push(q.front()->rchild);
				q.pop();

			}
		}
		len = index;
	}
	void display()
	{
		for (int i = 0; i < len; i++)
		{
			cout << a[i]->data;
			if (i == len - 1)
				cout << endl;
			else
				cout << " ";
		}
		for (int i = 0; i < len; i++)
		{
			cout << b[i];
			if (i == len - 1)
				cout << endl;
			else
				cout << " ";
		}
	}
};

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		BiTree mytree;
		mytree.Create();
		mytree.BFS();
		mytree.display();
	}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 3ds文件是3D Studio Max的文件格式,而stp是一种通用的3D CAD文件格式。要将3ds文件转换为stp,你需要使用一个3D文件转换器软件,例如Autodesk Inventor或SolidWorks等软件。以下是使用Autodesk Inventor进行转换的步骤: 1. 打开Autodesk Inventor软件并创建一个新文件。 2. 在“文件”菜单下,选择“导入”,然后选择你的3ds文件。 3. 在“导入”对话框中,选择“STP”作为输出文件格式,并设置其他选项。 4. 点击“导入”按钮,程序将开始转换你的3ds文件为stp格式。 5. 保存你的stp文件,并在你的CAD软件中打开它进行查看和编辑。 请注意,转换的结果可能不会完全符合你的期望,因为3ds和stp文件格式之间存在差异。检查并调整转换结果是很重要的。 ### 回答2: 3DS文件和STP文件分别是不同的3D模型文件格式。3DS文件是3D Studio Max软件常用的文件格式,而STP文件是Standard for the Exchange of Product model data(STEP)标准的文件格式。如果想将3DS文件转换为STP文件,可以通过以下步骤进行: 1. 找到适合的转换工具:在互联网上搜索并找到适合的3DS到STP文件格式转换工具。有许多在线转换工具和软件可以进行文件格式转换。一些常用的工具包括Autodesk Fusion 360、FreeCAD、SolidWorks等。 2. 下载并安装转换工具:根据所选的工具,下载并安装相应的软件。 3. 打开转换工具:启动所下载的转换工具,然后导入要转换的3DS文件。通常,在软件的菜单栏中会有一个“导入”或“打开”选项,点击这些选项可以找到并选择3DS文件。 4. 确认转换设置:在导入3DS文件之后,转换工具通常会显示一些设置选项,例如文件的单位制、尺寸、材质等。根据需要进行相应的设置,并确保转换选项设置为STP文件格式。 5. 进行文件转换:设置完毕后,点击转换按钮或菜单选项执行文件转换操作。转换时间可能取决于3DS文件的大小和计算机性能。 6. 保存转换后的文件:转换完成后,转换工具通常会要求您选择转换后的文件保存路径和文件名。选择合适的位置和文件名,并保存STP格式的文件。 7. 检查转换结果:在转换完成后,您可以打开STP文件,使用相应的3D软件来验证转换结果。确保文件在转换过程中没有丢失或损坏。 请注意,转换的结果可能会因所使用的转换工具和软件版本而有所不同。为了获得最佳的转换结果,建议使用专业的CAD软件和最新版本的转换工具。 ### 回答3: 要将3ds文件转换成stp文件,需要使用专业的三维建模软件进行操作。以下是一种可能的转换方法: 首先,打开支持3ds和stp文件格式的建模软件,例如SolidWorks、Autodesk Inventor或CATIA等。 在软件界面上,选择导入(Import)或打开(Open)选项,然后浏览系统中的文件,找到要转换的3ds文件并选择打开。 软件会自动将3ds文件导入到场景中。请注意,由于3ds文件和stp文件的差异,部分对象可能需要进行调整或重建。 在软件中,选择导出(Export)选项,然后选择stp格式作为输出格式。 设置导出选项。通常可以选择导出的对象、单位制、尺寸等。根据实际需求进行设置并确认。 选择导出的文件路径和文件名,然后点击导出或确认按钮。 软件会开始将3ds文件转换成stp格式,并将生成的stp文件保存到指定的路径中。 转换完成后,可以在指定路径中找到已转换的stp文件,可以使用stp文件在其他软件中进一步使用和编辑三维模型。 需要注意的是,由于3ds和stp是不同的文件格式,转换过程中可能会有部分细节的损失或不一致。因此,在进行转换前最好备份原始3ds文件,以免意外损失数据。 此外,还可以使用在线转换工具或其他第三方软件来进行3ds到stp的转换,具体步骤可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值