二叉树后序遍历栈实现
来源:互联网 发布:可信的玉石品牌 知乎 编辑:程序博客网 时间:2024/05/16 18:28
AnyView上的一道题目 按理说应该不难 许久才a = =
ps:题目说的也是不怎么清楚
ac code:
/**********【题目】试利用栈及其基本操作写出二叉树T的非递归的后序遍历算法(提示:为分辨后序遍历时两次进栈的不同返回点,需在指针进栈时同时将一个标志进栈)。二叉链表类型定义:typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild;} BiTNode, *BiTree;可用栈类型Stack的相关定义:typedef struct { struct BiTNode *ptr; // 二叉树结点的指针类型 int tag; // 0..1} SElemType; // 栈的元素类型Status InitStack(Stack &S); Status StackEmpty(Stack S); Status Push(Stack &S, SElemType e);Status Pop(Stack &S, SElemType &e); Status GetTop(Stack S, SElemType &e); **********/void pushNode(Stack &s,BiTNode *p,int tag){ SElemType e; e.ptr = p; e.tag = tag; //向下tag = 0 Push(s,e);}void PostOrder(BiTree T, void (*visit)(TElemType))/* 使用栈,非递归后序遍历二叉树T, *//* 对每个结点的元素域data调用函数visit */{ Stack s; InitStack(s); //初始化栈 BiTree p; pushNode(s,T,0); SElemType e; while (StackEmpty(s) == FALSE) { Pop(s,e); p = e.ptr; if (p->lchild != NULL && e.tag == 0) { pushNode(s,p,1); pushNode(s,p->lchild,0); } else if (p->rchild != NULL && e.tag != 2) { pushNode(s,p,2); pushNode(s,p->rchild,0); } else visit(p->data); }}
下面这种是不使用栈的后序遍历 不过要三叉链表和添加标记域mark,也算是不错的思路
code:
/**********【题目】假设在三叉链表的结点中增设一个标志域(mark取值0,1或2)以区分在遍历过程中到达该结点时应继续向左或向右或访问该结点。试以此存储结构编写不用栈辅助的二叉树非递归后序遍历算法。带标志域的三叉链表类型定义:typedef struct TriTNode { TElemType data; struct TriTNode *lchild, *rchild, *parent; int mark; // 标志域} TriTNode, *TriTree;**********/void PostOrder(TriTree T, void (*visit)(TElemType))/* 不使用栈,非递归后序遍历二叉树T, *//* 对每个结点的元素域data调用函数visit */{ if (T == NULL) return; TriTree p = T; while (p != NULL) { if (p->mark == 0) { p->mark = 1; if (p->lchild != NULL) p = p->lchild; } else if (p->mark == 1) { p->mark = 2; if (p->rchild != NULL) p = p->rchild; } else { visit(p->data); p = p->parent; } }}
0 0
- 二叉树后序遍历栈实现
- 二叉树后序遍历非递归实现
- 二叉树后序遍历的循环实现(JAVA)
- 二叉树后序遍历非递归实现
- 二叉树后序遍历的迭代实现
- 二叉树后序遍历的非递归实现
- 借助栈实现二叉树中序遍历
- 栈 实现中序后序先序遍历二叉树
- 利用栈来实现二叉树前序遍历
- 二叉树的遍历---栈实现
- 二叉树遍历 实现
- 二叉树后序遍历的非递归实现->陈越 节点二次入栈实现的变形
- 二叉树遍历,栈实现二叉树的非递归遍历
- 二叉树遍历(非递归实现--栈实现)
- 二叉树遍历(遍历C#实现)
- C#实现二叉树遍历
- java实现 二叉树遍历
- 二叉树三种非递归遍历实现
- sbt更改默认ivy仓库位置
- HDU 1532(最大流模板题)
- bzoj1044 木棍分割 二分+贪心&dp优化
- 数据结构实验 第一单元 集合交并
- Linux Advance--set_fl 和 clr_fl
- 二叉树后序遍历栈实现
- C++ 容器使用自定义排序逻辑对中英文进行排序
- oc
- cf div2 #333 D. Lipshitz Sequence (单调栈)
- source insight 常用快捷键
- 善于利用指针
- 棋盘覆盖
- 简单常用的正则表达式学习
- 151127UITableView顶部有一个空白区域