0
点赞
收藏
分享

微信扫一扫

[二叉树]BM25 二叉树的后序遍历-简单

​​BM25 二叉树的后序遍历​​

知识点​​树​​​​递归​​​​dfs​​​​广度优先搜索(BFS)​​

描述

给定一个二叉树,返回他的后序遍历的序列。

后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。

数据范围:二叉树的节点数量满足 [二叉树]BM25 二叉树的后序遍历-简单_二叉树 ,二叉树节点的值满足 [二叉树]BM25 二叉树的后序遍历-简单_非递归_02 ,树的各节点的值各不相同


样例图[二叉树]BM25 二叉树的后序遍历-简单_非递归_03

示例1

输入:

{1,#,2,3}

复制返回值:

[3,2,1]

复制说明:

如题面图

示例2

输入:

{1}

复制返回值:

[1]

题解

递归实现

#include <bits/stdc++.h>

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);
}
}
}
}
举报

相关推荐

0 条评论