用栈后续遍历二叉树的非递归算法!这有算法,哪位大虾抽点时间帮我用c++实现!感激不尽!
【NAS系统】DSM7.2部署SVN服务 早期的群晖版本可以在套件中心找到SVN Server直接安装,然后配置仓库和用户。但2提到DSM7.0之后套件中心没有SVN了,得用Docker。 阅读详情
typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
0 } PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//用栈后续遍历二叉树的非递归算法,
{
PMType a;
InitStack(S); //S的元素为PMType类型
Push (S,{T,0}); //根结点入栈
while(!StackEmpty(S))
{
Pop(S,a);
switch(a.mark)
{
case 0:
Push(S,{a.ptr,1}); //修改mark域
if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); //访问左子树
break;
case 1:
Push(S,{a.ptr,2}); //修改mark域
if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); //访问右子树
break;
case 2:
visit(a.ptr); //访问结点,返回
}
}//while
}//PostOrder_Stack
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.
BTNode* ptr;
enum {0,1,2} mark;
0 } PMType; //有mark域的结点指针类型
void PostOrder_Stack(BiTree T)//用栈后续遍历二叉树的非递归算法,
{
PMType a;
InitStack(S); //S的元素为PMType类型
Push (S,{T,0}); //根结点入栈
while(!StackEmpty(S))
{
Pop(S,a);
switch(a.mark)
{
case 0:
Push(S,{a.ptr,1}); //修改mark域
if(a.ptr->lchild) Push(S,{a.ptr->lchild,0}); //访问左子树
break;
case 1:
Push(S,{a.ptr,2}); //修改mark域
if(a.ptr->rchild) Push(S,{a.ptr->rchild,0}); //访问右子树
break;
case 2:
visit(a.ptr); //访问结点,返回
}
}//while
}//PostOrder_Stack
分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作.
...全文
相关推荐
二叉树先序遍历、中序遍历和后序遍历非递归算法 C++源码
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
二叉树的中序遍历非递归算法
利用栈的基本操作实现二叉树的中序遍历非递归算法。
C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法本文主要介绍了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,涉及C++二叉树的定义、遍历、统计相关操作技巧。
二叉树先序、中序、后序遍历(递归、非递归算法)
二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。在数据结构和算法领域,二叉树遍历是基础且重要的操作,主要用于访问和处理二叉树中的所有节点。


