1. 程式人生 > >二叉樹深度優先遍歷和廣度優先遍歷

二叉樹深度優先遍歷和廣度優先遍歷

因此 怎麽 code ron inf 技術 廣度優先搜索 二叉樹的遍歷 eat

技術分享圖片

對於一顆二叉樹,深度優先搜索(Depth First Search)是沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。以上面二叉樹為例,深度優先搜索的順序為:ABDECFG。怎麽實現這個順序呢 ?深度優先搜索二叉樹是先訪問根結點,然後遍歷左子樹接著是遍歷右子樹,因此我們可以利用堆棧的先進後出的特點,現將右子樹壓棧,再將左子樹壓棧,這樣左子樹就位於棧頂,可以保證結點的左子樹先與右子樹被遍歷。

廣度優先搜索(Breadth First Search),又叫寬度優先搜索或橫向優先搜索,是從根結點開始沿著樹的寬度搜索遍歷,上面二叉樹的遍歷順序為:ABCDEFG.可以利用隊列實現廣度優先搜索。

 1
#include <vector> 2 #include <iostream> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 struct BitNode 8 { 9 int data; 10 BitNode *left, *right; 11 BitNode(int x) :data(x), left(0), right(0){} 12 }; 13 14 void Create(BitNode *&root)
15 { 16 int key; 17 cin >> key; 18 if (key == -1) 19 root = NULL; 20 else 21 { 22 root = new BitNode(key); 23 Create(root->left); 24 Create(root->right); 25 } 26 } 27 28 void PreOrderTraversal(BitNode *root) 29 { 30 if (root) 31
{ 32 cout << root->data << " "; 33 PreOrderTraversal(root->left); 34 PreOrderTraversal(root->right); 35 } 36 } 37 38 //深度優先搜索 39 //利用棧,現將右子樹壓棧再將左子樹壓棧 40 void DepthFirstSearch(BitNode *root) 41 { 42 stack<BitNode*> nodeStack; 43 nodeStack.push(root); 44 while (!nodeStack.empty()) 45 { 46 BitNode *node = nodeStack.top(); 47 cout << node->data << ; 48 nodeStack.pop(); 49 if (node->right) 50 { 51 nodeStack.push(node->right); 52 } 53 if (node->left) 54 { 55 nodeStack.push(node->left); 56 } 57 } 58 } 59 60 //廣度優先搜索 61 void BreadthFirstSearch(BitNode *root) 62 { 63 queue<BitNode*> nodeQueue; 64 nodeQueue.push(root); 65 while (!nodeQueue.empty()) 66 { 67 BitNode *node = nodeQueue.front(); 68 cout << node->data << ; 69 nodeQueue.pop(); 70 if (node->left) 71 { 72 nodeQueue.push(node->left); 73 } 74 if (node->right) 75 { 76 nodeQueue.push(node->right); 77 } 78 } 79 } 80 81 int main() 82 { 83 BitNode *root = NULL; 84 Create(root); 85 //前序遍歷 86 PreOrderTraversal(root); 87 //深度優先遍歷 88 cout << endl << "dfs" << endl; 89 DepthFirstSearch(root); 90 //廣度優先搜索 91 cout << endl << "bfs" << endl; 92 BreadthFirstSearch(root); 93 }

二叉樹深度優先遍歷和廣度優先遍歷