LeetCode102.二叉樹的層序遍歷

Tomorrowland_D發表於2024-07-23

LeetCode題目連結:https://leetcode.cn/problems/binary-tree-level-order-traversal/submissions/548489149/

題目敘述:

給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

這道題就是簡單的叫我們求層序遍歷的程式碼,二叉樹的層序遍歷實際上就是一個廣度優先遍歷(BFS),我們可以用一個佇列來模擬這個過程。

步驟1

1.力扣上面的原題要求我們返回一個二維陣列,即每個一維陣列儲存每一層遍歷的結果,我們首先定義一個vector的二維陣列result,如果傳入的根節點為空,我們直接返回這個空的二維陣列即可。

步驟2

2.如果根節點不為空的話,我們定義一個佇列queue,並將根節點入隊。

步驟3

3.接下來我們就是來模擬層序遍歷的過程了,我們在佇列裡操作這顆二叉樹的節點時,當佇列為空,二叉樹是不是就已經遍歷完了?可以自己手動模擬試一試,可以很容易的發現,當佇列為空時,我們的二叉樹

就遍歷完了,因此,我們的外層迴圈條件為佇列不為空

步驟4

4.由於我們的題目要求我們要返回每一層遍歷的結果,因此,我們需要一個元素來記錄我們當前層次的元素個數,怎麼記錄呢?————就是當前佇列的元素個數,因此,我們可以使用size變數來儲存我們當前

層次的元素個數,並用一個陣列current來記錄當前層次遍歷的結果,最後每一次將current放入result即可,接下來就進入迴圈的過程了,我們遍歷每一層的時候操作size次,就可以將當前層次的元素全部

遍歷,並且將下一層的元素全部入隊。

怎麼將佇列中的元素放進陣列呢?

我們在單層迴圈內,可以使用node變數,來取出我們佇列的頭部元素,同時將頭部元素出隊,並將node->val存入當前陣列current中,判斷node的左孩子是否為空,若不為空,就將node的左孩子入隊,右孩子

也是如此。最後,經過若干次迴圈,當佇列中的元素為空時,我們的遍歷也就完成了

最後,這道題完整的程式碼如下:

class Solution {
public:
	vector<vector<int>> levelOrder(TreeNode* root) {
		//定義二維陣列,作為返回結果
		vector<vector<int>> result;
		//根節點為空,就直接返回空陣列
		if (root == NULL) return result;
		//定義模擬佇列
		queue<TreeNode*> que;
		//根節點入隊
		que.push(root);
		while (!que.empty()) {
			//記錄每一層的操作次數
			int size = que.size();
			//使用current陣列來儲存每一層遍歷的結果
			vector<int> current;
			//每一層迴圈size次就可以了
			while(size--) {
				//取隊頭元素
				TreeNode* node = que.front();
				//隊頭元素出隊
				que.pop();
				//將每一層遍歷的元素放入current陣列中
				current.push_back(node->val);
				//看左孩子是否為空,不為空就將左孩子入隊
				if (node->left != nullptr) que.push(node->left);
				if (node->right != nullptr) que.push(node->right);
			}
			//將current陣列放入二維陣列當中
			result.push_back(current);
		}
		//最後,返回這個二維陣列就可以了!
		return result;
	}
};

相關文章