用文件创建一颗二叉树
本次使用到的类有:
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);
}
需要注意的地方,这里需要引入全局变量temp和length
即在定义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);
};