题目描述:
题号:102
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。
解题思路:
思路一:广度优先搜索
本题本质是考察二叉树的广度优先搜索(使用辅助队列)
-
初始化:创建一个队列,将根节点入队。
-
开始搜索:当队列不为空时,执行以下步骤:
-
出队:从队列中取出一个节点。
-
访问节点:访问(或处理)该节点。
-
扩展节点:如果该节点有左子节点,将左子节点入队;如果该节点有右子节点,将右子节点入队。
-
-
重复搜索:重复步骤2,直到队列为空。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr) {
return {};
}
queue<TreeNode*> subQue;
vector<vector<int>> res;
subQue.push(root);
while (!subQue.empty()) {
vector<int> tmp;
int size = subQue.size();
for(int i = 0; i < size; i++) {
auto tempNode = subQue.front();
subQue.pop();
tmp.push_back(tempNode->val);
if (tempNode->left != nullptr) {
subQue.push(tempNode->left);
}
if (tempNode->right != nullptr) {
subQue.push(tempNode->right);
}
}
res.push_back(tmp);
}
return res;
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
res := [][]int{}
subQue := []*TreeNode{root}
for i := 0; len(subQue) > 0; i++ {
res = append(res, []int{})
tmp := []*TreeNode{}
for j := 0; j < len(subQue); j++ {
tempNode := subQue[j]
res[i] = append(res[i], tempNode.Val)
if tempNode.Left != nil {
tmp = append(tmp, tempNode.Left)
}
if tempNode.Right != nil {
tmp = append(tmp, tempNode.Right)
}
}
subQue = tmp
}
return res
}