用文件创建一颗二叉树

用文件创建一颗二叉树

本次使用到的类有:
fstream类
string类

#include"fstream"
#include"string"

首先建立一个txt文本:
在这里插入图片描述
这代表了一棵二叉树(如图)
三个符号分别对应:数据、左孩子、右孩子(存在为1,不存在为0)
在这里插入图片描述
于是需要两个函数。第一个把文件转化为数组,第二个把数组转化为二叉树

文件转化为数组

在这里,我使用了结构体。

struct Node
{
	char data;//数据
	int number1;//第一个数
	int number2;//第二个数
};

然后进行转化:

Node* BiTree::read_file(string file_name)//string串定义了一个字符串,这个字符串用来记录文件的路径
{
	ifstream input;//定义一个读取文件流的对象
	int line = 1;//定义一个行数,这个是用来确定结构体数组长度的
	char c;//c只是一个过程量,在求行数的过程中用到
	input.open(file_name);//打开文件
	if (input.fail())//判断文件是否存在
		cout << "打开文件失败!" << endl;
	else
		cout << "打开文件成功!" << endl;
		
	while (input.get(c))//求行数
	{
		if (c == '\n')
			line++;
	}
	
	Node *s = new Node[line];
	
	//length = line;  
	//注意!!!这里需要记录行数,在后面将数组转化为二叉树的时候尤其重要,可以“引用”或者“定义一个全局变量”!!!

	input.clear();
	input.seekg(0,ios::beg);
	//这两部操作让文件的指针重新回到开头,因为刚刚在求行数的时候已经让文件指针遍历到了尾部
	
	for (int i = 0; i < line; i++)//读取文件
	{
		input >> s[i].data>> s[i].number1>> s[i].number2;
	}

	input.close();//关闭文件
	return s;
}

将数组转化为二叉树

首先,定义一个节点

struct Binode
{
	char data;
	Binode*lChild;
	Binode*rChild;
};
void BiTree::creatBiTree1(Node * s,Binode*&BT)
{
	if(temp<length)//终止条件,这里需要用到length!!!
	{
		BT = new Binode;
		int h = temp;//把temp暂时保存
		BT->data = s[temp++].data;//每次赋值之后temp+1
		BT->lChild = NULL;
		BT->rChild = NULL;
		if (s[h].number1 == 1)
		{
			creatBiTree1(s, BT->lChild);//创建左子树
		}

		if (s[h].number2 == 1)
		{
			creatBiTree1(s, BT->rChild);//创建右子数
		}
	}
}

将两个程序整合:

void BiTree::creatBitree_File(string file_name, Binode *& root)
{
	Node*s=read_file(file_name);
	creatBiTree1(s, root);
}

需要注意的地方,这里需要引入全局变量templength
即在定义BiTree类public里面声明一下。

class BiTree
{
public:
	BiTree();
	~BiTree();
	void creatBitree_File(string file_name, Binode*&root);
	int length=0;//全局变量
	int temp = 0;//全局变量
private:
	Node* read_file(string file_name);
	void creatBiTree1(Node* s, Binode *&BT);
};

运行结果截图:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值