树的遍历算法-只有一个变量T-递归和非递归

void PostOrderTraverse(BTNode *T)
{   //就用到了一个变量T
    if(T==NULL)
        return;
     PostOrderTraverse(T->lchild);
     PostOrderTraverse(T->rchild);
     printf("%c",T->data);
}

 

前序非递归测试代码

#include <stdio.h>
#include <malloc.h>
#define ElemType char

//顺序栈结构的定义 typedef struct { ElemType St[MaxSize]; int top; }SqStack;

int MaxSize=20;

 
//二叉树结点的定义 typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

//先序建立二叉树,大话p187,教科书吧版 BiTree CreateBiTree() { char ch; BiTree T; scanf("%c",&ch); if(ch=='#') T=NULL; else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T;//返回根节点 } //非递归遍历算法
//简答:指向根结点指针进站,@访问该结点并且退站,退出结点的右左分别进站
//@这句话一直执行-直到栈为空即是top==-1
//主要用到工作指针变量p和top变量来操纵数据结构
void PreOrder(BiTree T) { BiTree p,St[20]; // St[MaxSize]里面数据元素的类型和T是一样,都是一样 int top=-1; if(T==NULL) return; top++ ; St[top]=T; //根结点进站,指向根结点的指针进站 while(top>-1) //while这个循环是主要的 { p=St[top];top--;printf("%c",p->data); //栈顶的那个退掉,退站并访问该根结点
   

    if(p->rchild!=NULL)   //右孩子进站 { top++; St[top]=p->rchild; } if(p->lchild!=NULL) //左孩子结点进站 { top++; St[top]=p->lchild; } } } //原理,根结点进站;只要z站不是空的?{退站并访问该结点,然后右左孩子进站(然后去判断那个条件满足吗?)} int main() { BiTree T; T = CreateBiTree();//建立 printf("先序遍历二叉树: "); PreOrder(T);//输出 printf(" "); return 0; }

 

原文地址:https://www.cnblogs.com/cs-lcy/p/7050692.html