构造树节点
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) {}
};
144、前序遍历
题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
思路
- 确定递归遍历函数参数和返回值:
- 参数:
cur
指向树的当前节点、vec
用来存放遍历过的节点值- 返回值:递归遍历函数的作用是遍历树,因此没有返回值
- 确定终止条件:
- 为了防止无限递归导致栈溢出
- 如果当前节点为空,递归结束,直接返回
- 确定递归逻辑:
- 前序遍历:根节点——>左子节点——>右子节点
代码
class Solution {
public:
//cur:当前节点、vec:存储遍历过的节点值
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;//确定终止条件
//递归逻辑
vec.push_back(cur->val);//根节点的值
traversal(cur->left, vec);//左子树
traversal(cur->right, vec);//右子树
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;//存储遍历过的节点值
traversal(root, res);//遍历整棵树
return res;
}
};
时间复杂度:O(n);n为树的节点
空间复杂度:O(n);调用函数使用的栈空间
145、后序遍历
题目描述
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
思路
- 确定递归遍历函数参数和返回值:
- 参数:
cur
指向树的当前节点、vec
用来存放遍历过的节点值- 返回值:递归遍历函数的作用是遍历树,因此没有返回值
- 确定终止条件:
- 为了防止无限递归导致栈溢出
- 如果当前节点为空,递归结束,直接返回
- 确定递归逻辑:
- 前序遍历:左子节点——>右子节点——>根节点
代码
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;//终止条件
traversal(cur->left, vec);//左子树
traversal(cur->right, vec);//右子树
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
时间复杂度:O(n);n为树的节点
空间复杂度:O(n);调用函数使用的栈空间
94、中序遍历
题目描述
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
思路
- 确定递归遍历函数参数和返回值:
- 参数:
cur
指向树的当前节点、vec
用来存放遍历过的节点值- 返回值:递归遍历函数的作用是遍历树,因此没有返回值
- 确定终止条件:
- 为了防止无限递归导致栈溢出
- 如果当前节点为空,递归结束,直接返回
- 确定递归逻辑:
- 前序遍历:左子节点——>根节点——>右子节点
代码
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec);//左
vec.push_back(cur->val);//中
traversal(cur->right, vec);//右
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
时间复杂度:O(n);n为树的节点
空间复杂度:O(n);调用函数使用的栈空间
树的递归遍历总结
- 递归函数参数设置
cur
指针指向当前节点、vec
保存节点值
- 终止条件
如果当前节点为空,表示遍历到叶子节点,直接返回
- 递归调用的顺序
- 前序遍历:中左右
- 中序遍历:左中右
- 后序遍历:左右中