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

轉載自:http://www.cnblogs.com/zhangbaochong/p/5492877.html

今天去百度面試,第二道題就是這個,寫不出來。。。記錄一下

  對於一顆二叉樹,深度優先搜索(Depth First Search)是沿着樹的深度遍歷樹的節點,儘可能深的搜索樹的分支。以上面二叉樹爲例,深度優先搜索的順序

爲:ABDECFG。怎麼實現這個順序呢 ?深度優先搜索二叉樹是先訪問根結點,然後遍歷左子樹接着是遍歷右子樹,因此我們可以利用堆棧的先進後出的特點,

現將右子樹壓棧,再將左子樹壓棧,這樣左子樹就位於棧頂,可以保證結點的左子樹先與右子樹被遍歷。

  廣度優先搜索(Breadth First Search),又叫寬度優先搜索或橫向優先搜索,是從根結點開始沿着樹的寬度搜索遍歷,上面二叉樹的遍歷順序爲:ABCDEFG.

可以利用隊列實現廣度優先搜索。

  下面給出二叉樹dfs和bfs的具體代碼:

複製代碼
 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 }
複製代碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章