BM23 二叉树的前序遍历
知识点树递归dfs广度优先搜索(BFS)
描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。数据范围:二叉树的节点数量满足 ,二叉树节点的值满足
,树的各节点的值各不相同
示例 1:
示例1
输入:
{1,#,2,3}
复制返回值:
[1,2,3]
题解
前序遍历:先访问根节点,再访问左节点,最后再访问右节点。此处提供递归和非递归2个版本的实现。
递归实现
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
void pre_order_r(TreeNode *root, std::vector<int> &v)
{
if (root == nullptr)
{
return;
}
v.push_back(root->val);
pre_order_r(root->left, v);
pre_order_r(root->right, v);
}
class Solution
{
public:
std::vector<int> preorderTraversal_r(TreeNode *root)
{
std::vector<int> v;
pre_order_r(root, v);
return v;
}
};
非递归实现
借助于栈,先将根节点放入栈中,然后访问栈顶元素,如果该元素的右节点不为空则将右节点压栈,如果左节点不为空则将左节点入栈,然后将栈顶元素出栈。重复此过程,直到栈为空。
void pre_order_transfer(TreeNode *root, std::vector<int> &v)
{
if (root == nullptr)
{
return;
}
std::stack<TreeNode *> s;
s.push(root);
while (!s.empty())
{
auto node = s.top();
s.pop();
v.push_back(node->val);
if (node->right != nullptr)
{
s.push(node->right);
}
if (node->left != nullptr)
{
s.push(node->left);
}
}
}