C++實現二叉樹建立、前序、中序、後序、層序遍歷
阿新 • • 發佈:2018-12-12
看完資料結構二叉樹部分後,通過學習書上的虛擬碼以及其他人的程式碼自己動手實現了一下,採用前序方式建立一顆二叉樹,實現了前中後層四種遍歷方式。
在層序遍歷部分與前三種遍歷不同,層序遍歷採用從根節點開始從上到下逐層遍歷,所以藉助佇列來實現,開始遍歷後,將根節點先壓入佇列,然後將左右孩子逐次壓入,然後先進先出,將front元素pop出來。
下面是程式碼
//標頭檔案宣告各成員函式 struct BiNode //構造樹節點 { public: char nodeData; BiNode *lchild, *rchild; }; class Tree { public: BiNode* create_node(const int &level,const string &pos); //建立一個樹節點 void PreOrder(BiNode *t); //前序 void InOrder(BiNode *t); //中序 void PostOrder(BiNode *t); //後序 void LevelOrder(BiNode *t); //層序 BiNode *root; //根節點 }; #include<queue> //實現函式 BiNode* Tree::create_node(const int &level,const string &pos) { char data; BiNode *node; cout << "請輸入資料:層數:" << level << "位置" << pos << endl; cin >> data; if (data == '0') { node = nullptr; return node; } else{ node = new BiNode; node->nodeData = data; node->lchild = create_node(level + 1, "left"); node->rchild = create_node(level + 1, "right"); return node; } } void Tree::PreOrder(BiNode *T) { if (T == nullptr) { return; } cout << T->nodeData << " "; PreOrder(T->lchild); PreOrder(T->rchild); } void Tree::InOrder(BiNode *T) { if (T == nullptr) { return; } InOrder(T->lchild); cout << T->nodeData<<" "; InOrder(T->rchild); } void Tree::PostOrder(BiNode *T) { if (T == nullptr) { return; } PostOrder(T->lchild); PostOrder(T->rchild); cout << T->nodeData<<" "; } void Tree::LevelOrder(BiNode *T) { queue<BiNode*> q; //注意標頭檔案的引用,採用了c++內部封裝的queue容器,佇列的 BiNode *p = new BiNode; //各個成員函式都封裝完成 if (T == nullptr) { return; } q.push(T); while (!q.empty()) { p = q.front(); cout << p->nodeData<<" "; q.pop(); if (p->lchild) { q.push(p->lchild); } if (p->rchild) { q.push(p->rchild); } } }
主函式呼叫
int main() { Tree T; int level = 1; T.root = T.create_node(level, "root"); cout << "前序遍歷" << endl; T.PreOrder(T.root); cout << endl<< "中序遍歷" << endl; T.InOrder(T.root); cout <<endl<< "後序遍歷" << endl; T.PostOrder(T.root); cout << endl<<"層序遍歷" << endl; T.LevelOrder(T.root); system("pause"); return 0; }
執行結果: