1. 二叉树的前序遍历
- 根 左 右
- 因为先访问根节点,所以直接将
root
的val
放入答案(ans)容器内。 - 然后遍历左子树,现在以
root
的左子树为root
进入递归。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> ans;
vector<int> preorderTraversal(TreeNode* root) {
if(root != NULL){
ans.push_back(root -> val);
preorderTraversal(root -> left);
preorderTraversal(root -> right);
}
return ans;
}
};
2. 二叉树的中序遍历
- 左 根 右
- 与前序遍历相似,只需要调换顺序。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
if(root!=NULL){
inorderTraversal(root->left);
ans.push_back(root->val);
inorderTraversal(root->right);
}
return ans;
}
};
3. 二叉树的后序遍历
- 左 右 根
class Solution {
public:
vector<int> ans;
vector<int> postorderTraversal(TreeNode* root) {
if(root!=NULL){
postorderTraversal(root->left);
postorderTraversal(root->right);
ans.push_back(root->val);
}
return ans;
}
};
4. 二叉树的层序遍历 - 广度优先搜索(BFS 队列)
给定一个二叉树,返回其按层序遍历得到的节点值。 层序遍历即逐层地、从左到右访问所有结点。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret; //定义输出的二维数组
if (!root) return ret; //如果没有节点,输出空的二维数组
queue <TreeNode*> q; //定义结构体队列q
q.push(root); //将根节点加入进去
while (!q.empty()) { //当队列不为空时,即表示二叉树还存在左右子树
int currentLevelSize = q.size(); //当前队列q内的元素个数
ret.push_back(vector <int> ()); //输出ret加入一个新的空vector
for (int i = 1; i <= currentLevelSize; i++) {
auto node = q.front(); q.pop(); //node取为q的第一个元素,再去掉这个元素
ret.back().push_back(node->val); //给ret的最后一个元素即空vector加入q的第一个元素
if (node->left) q.push(node->left); //如果存在左节点,给队列q加入该节点
if (node->right) q.push(node->right);
}
}
return ret;
}
};
/*返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
*/
//只需要反序输出二维数组即可(有以下两种方法)
reverse(ret.begin(),ret.end());
return vector <vector <int>>(ret.rbegin(),ret.rend());
复杂度分析
记树上所有节点的个数为 n。
时间复杂度:每个点进队出队各一次,故渐进时间复杂度为 O(n)。
空间复杂度:队列中元素的个数不超过 n 个,故渐进空间复杂度为 O(n)。
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/