二叉樹的五種遍歷:前序,中序,後序,非遞迴方法(棧),bfs+佇列)
阿新 • • 發佈:2018-12-18
二叉樹的五種遍歷:
遞迴遍歷:前序,中序,後序,非遞迴方法(棧);
層次遍歷(bfs+佇列);
#include <vector> #include <iostream> #include <stack> #include <queue> using namespace std; struct BitNode { int data; BitNode *left, *right; BitNode(int x) :data(x), left(0), right(0){} }; //二叉樹的建立 void Create(BitNode *&root) { int key; cin >> key; if (key == -1) //-1表示無結點 root = NULL; else { root = new BitNode(key); Create(root->left); Create(root->right); } } //先序遍歷二叉數 void PreOrderTraversal(BitNode *root) { if (root) { cout << root->data << " "; PreOrderTraversal(root->left); PreOrderTraversal(root->right); } } //中序遍歷二叉樹 void InOrderTraversal(BitNode *root) { if (root) { InOrderTraversal(root->left); cout << root->data << " "; InOrderTraversal(root->right); } } //後序遍歷二叉樹 void PosOrderTraversal(BitNode *root) { if (root) { PosOrderTraversal(root->left); PosOrderTraversal(root->right); cout << root->data << " "; } } //深度優先搜尋 //利用棧,現將右子樹壓棧再將左子樹壓棧 void DepthFirstSearch(BitNode *root) { stack<BitNode*> nodeStack; nodeStack.push(root); while (!nodeStack.empty()) { BitNode *node = nodeStack.top(); cout << node->data << ' '; nodeStack.pop(); if (node->right) { nodeStack.push(node->right); } if (node->left) { nodeStack.push(node->left); } } } //廣度優先搜尋 ,佇列實現 void BreadthFirstSearch(BitNode *root) { queue<BitNode*> nodeQueue; nodeQueue.push(root); while (!nodeQueue.empty()) { BitNode *node = nodeQueue.front(); cout << node->data << ' '; nodeQueue.pop(); if (node->left) { nodeQueue.push(node->left); } if (node->right) { nodeQueue.push(node->right); } } } int main() { BitNode *root = NULL; Create(root); //前序遍歷 PreOrderTraversal(root); //深度優先遍歷 cout << endl << "dfs" << endl; DepthFirstSearch(root); //廣度優先搜尋 cout << endl << "bfs" << endl; BreadthFirstSearch(root); }