二叉樹的層序遍歷詳細講解(附完整C++程式)
1 說明
二叉樹的層序遍歷是面試經常會被考察的知識點,甚至要求當場寫出實現過程。筆者先後被騰訊和滴滴面試官問過這個問題,騰訊面試官是讓稱述整個實現過程,本人自信滿滿的說出來了,所以也沒有對具體實現太上心。等到滴滴面試的時候,讓我詳細寫出實現,真正上手之後發現原理懂,但是如果沒有朝一個正確的方向努力原來還是蠻棘手的,等下我再說本人卡殼在哪個地方了。
2 原理介紹
層序遍歷所要解決的問題很好理解,就是按二叉樹從上到下,從左到右依次列印每個節點中儲存的資料。如下圖:
按層序遍歷的原則,列印順序依次應該是:A->B->C->D->E->F->G。
看完是不是感觸非常深,這不就是佇列資料結構最拿手的絕活嗎,FIFO,先進先出!我從上到下,從左到右依次將每個數放入到佇列中,然後按順序依次列印就是想要的結果。
實現方案的確很好想到,但是具體實現容易卡殼在你是將什麼放入佇列中。本人當時面試僅儲存每個資料到佇列中,造成訪問完A,然後將B和C(左右孩子)放入佇列,並且刪除最前面一個數(當前也就是A),這樣B就輪到了最前方。想著是依次下去,但是如果佇列僅存資料就會發現,不知道後面如何順序訪問下去,也不知道二叉樹何時停止。所以正確的方式是佇列中每個節點應該是儲存一個二叉樹的指標,這樣才能依次依靠指標left和right訪問下去。
原理還是挺簡單的,筆者認為除了上面需要主要其他都挺好理解的,下面直接看C++程式以及程式中註解吧。
3 C++實現程式
#include<cstdio>
#include<queue>
using namespace std;
/*二叉樹結構體,並且構建了有參建構函式*/
struct BinaryTree{
int vec;
BinaryTree* left;
BinaryTree* right;
BinaryTree(int data)
:vec(data), left(nullptr), right(nullptr){
}
};
/*佇列實現層序遍歷*/
void printTree(BinaryTree* arr[])
{
queue<BinaryTree*> rel; //定義一個佇列,資料型別是二叉樹指標,不要僅是int!!不然無法遍歷
rel.push(arr[0]);
while (!rel.empty())
{
BinaryTree* front = rel.front();
printf("%d\n", front->vec);
rel.pop(); //刪除最前面的節點
if (front->left != nullptr) //判斷最前面的左節點是否為空,不是則放入佇列
rel.push(front->left);
if (front->right != nullptr)//判斷最前面的右節點是否為空,不是則放入佇列
rel.push(front->right);
}
}
int main(){
/*構建二叉樹*/
BinaryTree* s_arr[6];
s_arr[0] = new BinaryTree(0);
s_arr[1] = new BinaryTree(1);
s_arr[2] = new BinaryTree(2);
s_arr[3] = new BinaryTree(3);
s_arr[4] = new BinaryTree(4);
s_arr[5] = new BinaryTree(5);
s_arr[0]->left = s_arr[1]; // 0
s_arr[0]->right = s_arr[2]; // 1 2
s_arr[1]->left = s_arr[3]; // 3 5
s_arr[3]->left = s_arr[4]; //4
s_arr[2]->right = s_arr[5]; //所以層序遍歷的結果為:0 1 2 3 5 4
/*層次遍歷列印所有節點*/
printTree(s_arr);
/*釋放所有空間*/
for (int i = 0; i < 6; i++)
delete s_arr[i];
return 0;
}
個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
轉載請註明出處:http://blog.csdn.net/FX677588/article/details/74276513
相關文章
- 層序遍歷二叉樹二叉樹
- 二叉樹的層序遍歷二叉樹
- 【C++】返回每一層二叉樹的平均值(層序遍歷)C++二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 建立二叉樹:層次遍歷--樹的寬度高度,後序遍歷--祖先節點二叉樹
- 二叉樹--後序遍歷二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- Leetcode 演算法題解系列 - 二叉樹的層序遍歷LeetCode演算法二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- LeetCode102.二叉樹的層序遍歷LeetCode二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 3143 二叉樹的序遍歷二叉樹
- 非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序遞迴二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- LeetCode-107-二叉樹的層序遍歷 IILeetCode二叉樹
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 94. 二叉樹的中序遍歷(迭代)二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 程式碼隨想錄演算法訓練營,9月9日 | 二叉樹遞迴遍歷,迭代遍歷,層序遍歷演算法二叉樹遞迴
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 中序線索二叉樹的建立與遍歷二叉樹
- 二叉樹(BST)中序遍歷的三種方法二叉樹
- LeeCode-94. 二叉樹的中序遍歷二叉樹
- 【模板題】- 94. 二叉樹的中序遍歷二叉樹
- 二叉樹的遍歷二叉樹