C 二叉樹計算檔案單詞數

2022-06-26 13:24:13 字數 3664 閱讀 6900

使用二叉樹計算檔案單詞數:

您的程式必須接受命令行上不確定數量的引數,第乙個引數指定輸出檔案,其餘指定輸入檔案。例如,引數可能如下所示:

輸出檔案 輸入檔案1 輸入檔案 2 …

有了這些引數,程式將依次開啟和讀取每個輸入檔案,建立乙個二叉樹(在構建時, 應將樹保持為完整的二叉樹),並在其進行過程中進行計數。

讀取並關閉所有檔案後,它必須建立輸出檔案並寫出樹中的單詞(您應該使用6種方法遍歷樹:順序、預序和後序,包括遞迴和非遞迴),每行乙個單詞,以及這個詞的出現。

您的程式應忽略單詞的大小寫,以便 "this" 和 "this" 被視為相同。然而,實際上拼寫不同的單詞,如 "car" 和 "cars" 被認為是不同的單詞。

為了允許很長的輸入檔案,每個單詞出現次數的字段寬度應至少為六位十進位制數字。您還應該彙總並列印不同單詞的數量。

上述要求都是英文必應翻譯的,意思差不多到了,主要就是用二叉樹統計單詞數量。那麼為什麼選用二叉樹呢?我個人的看法是因為二叉樹便於搜尋,如果是線性表的話,進行搜尋難免會出現從頭檢索到尾的情況,即使做了許多優化也不一定能有二叉樹的效率。

在c++中可以方便地呼叫#include進行檔案的讀寫,它定義了三種資料型別:

ofstream表示輸出檔案流,用於建立檔案並向檔案寫入資訊。

ifstream表示輸入檔案流,用於從檔案讀取資訊。

fstream表示檔案流,且同時具有 ofstream 和 ifstream 兩種功能。

我們使用open()函式開啟檔案,使用close()函式關閉檔案;讀取和寫入則與cincout相同,使用<<>>

#include//讀取指定位置檔案

string inf;

ifstream infile;

infile.open(inf.data());

char c;

infile >> c;

infile.close();

end of file:檔案的末尾會有乙個叫做eof的標記,我們可以使用infile.eof()方便地判斷是否到達檔案末尾。

原理上我們需要進行檔案的寫入,但是我寫這個**時間比較短,又懶得debug,這個功能就被我遺棄了。

讀取檔案,並乙個乙個字元地進行單詞判斷(此時應注意忽略大小寫)。

string s = " ";

char c;

while (!infile.eof())

//忽略大小寫

else if(c >= 'a' && c <= 'z')

//當讀到非字母或數字時,將非空的字串s插入到二叉樹中

else if(s != " ")

}

以第乙個單詞構建二叉樹,比較並插入其它單詞的二叉樹節點。這要求我們的二叉樹節點類包括以下內容:在這裡直接友元二叉樹類很明顯是我偷懶啦

class binarytreenode;
插入時修改了層次遍歷的**,遍歷二叉樹時直接用 string 標準庫的過載函式進行比較,如果相同則計數並刪除。

if(pointer->word == node->word)
鑑於**直接從上面二叉樹拉過來的,直接修改visit()函式,以及在遍歷時做好計數即可。

在老師給的文件裡特別宣告了,因為節點類中包括 string 型別成員變數,我們需要在析構的時候特別注意……對不起我忘了注意了!但因為沒有 error 所以最後也沒注意

#include"binarytree.h"

#include #include #include using namespace std;

int main()

else if(c >= 'a' && c <= 'z')

else if(s != " ")

} infile.close();

} cout<

class binarytreenode;

class binarytree;

class binarytreenode;

class binarytree;

#endif //binarytree_h

#include"binarytree.h"

#include#include#includeusing namespace std;

binarytreenode::binarytreenode()

binarytreenode::binarytreenode(string & str)

binarytree::binarytree()

binarytree::binarytree(binarytreenode * r)

binarytree::~binarytree()

void binarytree::visit(binarytreenode * pointer)

void binarytree::dinorder(binarytreenode * node)

void binarytree::dpostorder(binarytreenode* node)

void binarytree::preorder()

else

} std::cout

binarytreenode * pointer = root;

while(!nodestack.empty()||pointer)

else

} std::cout

binarytreenode * pointer = root;

binarytreenode * pre = root;

while(pointer != nullptr)

while(pointer != nullptr && (pointer -> rightchild == nullptr

|| pre == pointer -> rightchild))

else

} if (pointer != nullptr)

} std::cout

binarytreenode * pointer = root;

if(pointer != nullptr)

while(!nodequeue.empty())

nodequeue.pop();

if (pointer->leftchild)

else

if (pointer->rightchild)

else

} delete node;

return false;

}void binarytree::levelorder()

std::cout都說軟院學生是最乖的,因為我們天天在想:我哪錯了?

目錄需求描述

具體實現

單詞樹(最優二叉樹)

在進行文法分析的時候,通常需要檢測乙個單詞是否在我們的單詞列表裡。為了提高查詢和定位的速度,通常都畫出與單詞列表所對應的單詞查詢樹,其特點如下 1 根結點不包含字母,除根結點外每乙個結點都僅包含乙個大寫英文本母 2 從根結點到某一結點,路徑上經過的字母依次連起來所構成的字母序列,稱為該結點對應的單詞...

二叉樹計算

術語 1.節點的度 乙個節點含有的子樹的個數稱為該節點的度 2.葉節點或終端節點 度為零的節點 3.非終端節點或分支節點 度不為零的節點 4.父親節點或父節點 若乙個節點含有子節點,則這個節點稱為其子節點的父節點 5.兄弟節點 具有相同父節點的節點互稱為兄弟節點 6.節點的層次 從根開始定義起,根為...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...