代码随想录二刷 |二叉树 |144.二叉树的前序遍历
- 题目描述
- 解题思路
- 代码实现
- 递归法
- 迭代法
题目描述
144.二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
解题思路
递归三部曲:
- 确定递归函数的参数和返回值
因为要打印出前序遍历节点的数值,所以参数里需要传入vector来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:void traversal(TreeNode* cur, vector<int>& vec)
- 确定终止条件
当前遍历节点空了,就直接returnif (cur == NULL) return;
- 确定单层递归的逻辑
前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:vec.push_back(cur->val); if (cur->left) vec.push(cur->left, vec); if (cur->right) vec.push(cur->right, vec);
代码实现
递归法
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
vec.push_back(cur->val);
if (cur->left) traversal(cur->left, vec);
if (cur->right) traversal(cur->right, vac);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
迭代法
// 前序遍历:中左右
// 入栈顺序:右左中
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
if (node != NULL) {
st.pop();
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
st.push(node);
st.push(NULL);
} else {
st.pop();
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};