随笔 - 9  文章 - 0  评论 - 35  阅读 - 54万 

  二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。二叉树后序遍历的非递归遍历中当当前节点存在右子树的时候需要先遍历右子树,因此要对二叉树的节点定义中添加_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;
}
}
}
}
复制代码
posted on   Glroy  阅读(694)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示