用文件創建一顆二叉樹

用文件創建一顆二叉樹

本次使用到的類有:
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);
};

運行結果截圖:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章