BM25 二叉树的后序遍历
知识点树递归dfs广度优先搜索(BFS)
描述
给定一个二叉树,返回他的后序遍历的序列。
后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。
数据范围:二叉树的节点数量满足 ,二叉树节点的值满足
,树的各节点的值各不相同
样例图
示例1
输入:
{1,#,2,3}
复制返回值:
[3,2,1]
复制说明:
如题面图
示例2
输入:
{1}
复制返回值:
[1]
题解
递归实现
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
void post_order_r(TreeNode *root, std::vector<int> &v)
{
if (root == nullptr)
{
return;
}
post_order_r(root->left, v);
post_order_r(root->right, v);
v.push_back(root->val);
}
std::vector<int> postorderTraversal(TreeNode *root)
{
std::vector<int> v;
post_order_r(root, v);
return v;
}
非递归实现
后续遍历的非递归实现其实和递归实现的思想是一样的
- 1. 如果当前节点不为空,且其左右节点为空,则访问该节点 (当前节点为叶节点)
- 2. 如果当前节点的左右任意节点不为空,则将左右节点先后入栈
- 3. 重复上面操作,如果当前节点的左右任意节点是上一个被访问的节点,则表示其左右节点已经被访问,可以直接访问该节点,然后将该节点出栈
void post_order_transfer(TreeNode *root, std::vector<int> &v)
{
if (root == nullptr)
{
return;
}
std::stack<TreeNode *> s;
s.push(root);
TreeNode *pre_node = nullptr;
while (!s.empty())
{
auto node = s.top();
if (node->left == nullptr && node->right == nullptr)
{
v.push_back(node->val);
pre_node = node;
s.pop();
}
else if (pre_node != nullptr && (node->left == pre_node || node->right == pre_node))
{
v.push_back(node->val);
pre_node = node;
s.pop();
}
else
{
if (node->right != nullptr)
{
s.push(node->right);
}
if (node->left != nullptr)
{
s.push(node->left);
}
}
}
}