二叉树后序遍历栈实现

来源:互联网 发布:可信的玉石品牌 知乎 编辑:程序博客网 时间: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