二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。二叉树后序遍历的非递归遍历中当当前节点存在右子树的时候需要先遍历右子树,因此要对二叉树的节点定义中添加_tag域,标志当前节点右子树是否已经遍历,备用的结构定义和函数:
//二叉树节点定义
class TreeNodeElement
{
public:
TreeNodeElement();
TreeNodeElement(int value);
TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r);
~TreeNodeElement();
private:
public:
int _value;
TreeNodeElement* _l;
TreeNodeElement* _r;
bool _tag;
};
typedef TreeNodeElement* TreeNode;
//构造函数的定义,前序和中序中相似,只是不需要_tag域
TreeNodeElement::TreeNodeElement()
{
_value = -1;
_l = NULL;
_r = NULL;
_tag = false;
}
TreeNodeElement::TreeNodeElement(int value)
{
_value = value;
_l = NULL;
_r = NULL;
_tag = false;
}
TreeNodeElement::TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r)
{
_value = value;
_l = l;
_r = r;
_tag = false;
}
//析构函数
TreeNodeElement::~TreeNodeElement()
{
delete _l;
delete _r;
}
访问函数:
//递归实现(visit)
void Visit(TreeNode node)
{
cout<<node->_value<<" ";
}
二叉树后序遍历的递归实现:
//递归遍历
void PostRetriveATree(TreeNode root,void (* visit)(TreeNode))
{
if (root)
{
PostRetriveATree(root->_l,visit);
PostRetriveATree(root->_r,visit);
(*visit)(root);
}
}
二叉树后序遍历的非递归实现:
//非递归遍历,添加#include <stack>
void PostRetriveATreeWithoutRecurve(TreeNode root,void (* visit)(TreeNode))
{
stack<TreeNode> tree;
while ((root != NULL) || (!tree.empty()))
{
while (root != NULL)
{
tree.push(root);
root = root->_l;
}
if (!tree.empty())
{
root = tree.top();
if (root->_tag) //可以访问
{
visit(root);
tree.pop();
root = NULL; //第二次访问标志其右子树也已经遍历
}
else
{
root->_tag = true;
root = root->_r;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?