使用二叉樹計算檔案單詞數:
您的程式必須接受命令行上不確定數量的引數,第乙個引數指定輸出檔案,其餘指定輸入檔案。例如,引數可能如下所示:上述要求都是英文必應翻譯的,意思差不多到了,主要就是用二叉樹統計單詞數量。那麼為什麼選用二叉樹呢?我個人的看法是因為二叉樹便於搜尋,如果是線性表的話,進行搜尋難免會出現從頭檢索到尾的情況,即使做了許多優化也不一定能有二叉樹的效率。輸出檔案 輸入檔案1 輸入檔案 2 …
有了這些引數,程式將依次開啟和讀取每個輸入檔案,建立乙個二叉樹(在構建時, 應將樹保持為完整的二叉樹),並在其進行過程中進行計數。
讀取並關閉所有檔案後,它必須建立輸出檔案並寫出樹中的單詞(您應該使用6種方法遍歷樹:順序、預序和後序,包括遞迴和非遞迴),每行乙個單詞,以及這個詞的出現。
您的程式應忽略單詞的大小寫,以便 "this" 和 "this" 被視為相同。然而,實際上拼寫不同的單詞,如 "car" 和 "cars" 被認為是不同的單詞。
為了允許很長的輸入檔案,每個單詞出現次數的字段寬度應至少為六位十進位制數字。您還應該彙總並列印不同單詞的數量。
在c++中可以方便地呼叫#include
進行檔案的讀寫,它定義了三種資料型別:
ofstream
表示輸出檔案流,用於建立檔案並向檔案寫入資訊。
ifstream
表示輸入檔案流,用於從檔案讀取資訊。
fstream
表示檔案流,且同時具有 ofstream 和 ifstream 兩種功能。
我們使用open()
函式開啟檔案,使用close()
函式關閉檔案;讀取和寫入則與cin
、cout
相同,使用<<
和>>
。
#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的所在子樹...