一、给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
样例
给一棵二叉树 {3,9,20,#,#,15,7}
:
3
/ \
9 20
/ \
15 7
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路:
1、用队列保存遍历的结点
2、创建一维vector用于保存每层的结点值
3、将每个一维vector加入二维vector
代码实现:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: A Tree
* @return: Level order a list of lists of integer
*/
vector<vector<int>> levelOrder(TreeNode * root) {
// write your code here
queue<TreeNode*> que;
TreeNode *front;
vector<int> w; // 每层的元素
vector<vector<int>> vec;
if(root == NULL)
return vec;
que.push(root);
while(!que.empty()){
int size = que.size();
while(size--){
front = que.front();
w.push_back(front->val);
que.pop();
if(front->left != NULL)
que.push(front->left);
if(front->right != NULL)
que.push(front->right);
}
vec.push_back(w);
w.clear();
}
return vec;
}
};
二、给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)
样例
给出一棵二叉树 {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
按照从下往上的层次遍历为:
[ [15,7], [9,20], [3] ]
解题思路:
在问题一的基础上用栈解决问题。
代码实现:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: A tree
* @return: buttom-up level order a list of lists of integer
*/
vector<vector<int>> levelOrderBottom(TreeNode * root) {
// write your code here
vector<int> w;
vector<vector<int>> vec;
stack<vector<int>> s;
queue<TreeNode*> q;
if(root == nullptr)
return vec;
q.push(root);
while(!q.empty()){
int size = q.size();
while(size--){
TreeNode* front = q.front();
w.push_back(front->val);
q.pop();
if(front->left != nullptr)
q.push(front->left);
if(front->right != nullptr)
q.push(front->right);
}
s.push(w);
w.clear();
}
while(!s.empty()){
vec.push_back(s.top());
s.pop();
}
return vec;
}
};