用文件創建一顆二叉樹
本次使用到的類有:
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);
};