前序遍历
先遍历访问根节点,然后遍历左子树,最后遍历右子树。
1. 函数递归方法
1.1 代码
class Solution {
public:
void preorder(TreeNode* node, vector<int>& res) {
if (node == nullptr) {
return;
}
res.push_back(node->val);
preorder(node->left, res);
preorder(node->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorder(root, res);
return res;
}
};
1.2 复杂度:
时间复杂度: 在二叉树遍历过程中,每个节点会被访问一次且只会被访问一次,时间复杂度O(n)。
空间复杂度:取决于递归的栈的深度,栈的深度在二叉树为一条链的情况下会达到O(n)
中序遍历
中序遍历,在遍历过程中先访问二叉树的左节点,而后访问根节点,最后访问右节点。
算法实现(C++实现)
1. 函数递归方法
1.1 代码
class Solution {
public:
void inorder(TreeNode* node, vector<int>& res) {
if (node == nullptr) {
return;
}
inorder(node->left, res);
res.push_back(node->val);
inorder(node->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
};
1.2 复杂度:
同前
2. 迭代方法
显示栈模拟隐式栈
3. Morris 中序遍历
后序遍历
1. 函数递归方法
1.1 代码
class Solution {
public:
void postorder(TreeNode* node, vector<int>& res) {
if (node == nullptr) {
return;
}
postorder(node->left, res);
postorder(node->right, res);
res.push_back(node->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
postorder(root, res);
return res;
}
};
1.2 复杂度:
同前
参考文档
[1] https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/