| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 924 人关注过本帖
标题:在此环境下,增加一个非递归后序遍历算法
只看楼主 加入收藏
k2c1314
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-7-4
收藏
 问题点数:0 回复次数:6 
在此环境下,增加一个非递归后序遍历算法

/*顺序堆栈的实现*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define NULL 0 #define INFEASIBLE -1 #define OVERFLOW -2 #include <stdio.h> #include <stdlib.h> //#include "bitree.h" #define STACK_INIT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; /*左右孩子指针*/ }BiTNode ,*BiTree; typedef BiTNode ElemType; typedef struct SqStack { ElemType *base; /*在栈构造之前和销毁之后,base的值为NULL*/ ElemType *top ; /*栈顶指针*/ int stacksize; /*当前已分配的存储空间,以元素为单位*/ }SqStack,*SS;

/*构造一个空栈*/ Status InitStack(SqStack &S) { S.base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(! S.base) exit(OVERFLOW); /*存储分配失败*/ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status PrintStack(SqStack S) { ElemType *i; int j=0; printf("i element value"); for(i=S.base;i<S.top;) printf("\n%d %d",j++,*(i++)); return OK; }

/*若栈不空,则e返回S的栈顶元素,并返回OK;否则返回ERROR*/ Status GetTop(SqStack S,ElemType &e) { if(S.top==S.base) return ERROR; e= *(S.top-1); return OK; } /*插入元素e为新的栈顶元素*/ Status Push(SqStack &S,ElemType e) { if(S.top-S.base>=S.stacksize) /*栈满,追加存储空间*/ { S.base=(ElemType *) realloc(S.base,(S.stacksize+STACKINCREMENT) *sizeof(ElemType)); if(! S.base) exit(OVERFLOW); /*存储分配失败*/ S.top=S.base+S.stacksize; S.stacksize +=STACKINCREMENT; } *S.top++=e; return OK; } /*若栈不空,则删除S的栈顶元素,用e返回其值,并返回*/ Status Pop(SqStack &S,ElemType &e) { if (S.top==S.base) return ERROR; e=* --S.top; return OK; }

/*返回S的元素个数,即栈的长度*/ Status StackLength(SqStack S,int &e) { e=S.top-S.base; return OK; } /*显示S中第i元素的值*/ ElemType StackValue(SqStack S,int i) { return (*(S.base+i-1)); }

Status StackEmpty(SqStack S) { return S.top==S.base; } /*函数结果状态代码*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #include <stdio.h> #include <stdlib.h> #include "sstack.h"

typedef int Status; /*Status 是函数的类型,其值是函数结果状态代码*/ /*----二叉树的二叉链表存储表示----*/

SqStack S; BiTree CreateBiTree( BiTree R) { /*按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树, 构造二叉链表表示的二叉树R。*/ TElemType Nodedata; scanf("%c",&Nodedata); if (Nodedata=='$') R=NULL; else { if(!(R=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); R->data=Nodedata; R->lchild=CreateBiTree(R->lchild); R->rchild=CreateBiTree(R->rchild); } return (R); } Status PreOrderTraverse( BiTree T,Status (*Visit)(TElemType e)) { /*采用二叉链表存储结构,Visit是对结点操作的应用函数。 先序遍历二叉树T的递归算法,对每个结点调用函数Visit一次且一次。 一旦Visit()访问失败,则操作失败。*/ if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK;

}

Status InOrderTraverse( BiTree T,Status (*Visit)(TElemType e)) /*采用二叉链表存储结构,Visit是对结点操作的应用函数。 中序遍历二叉树T,对每个结点调用函数Visit一次且一次。 一旦Visit()访问失败,则操作失败。*/ { if(T) { if(InOrderTraverse(T->lchild,Visit)) if(Visit(T->data)) if(InOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } Status PostOrderTraverse( BiTree T,Status (*Visit)(TElemType e)) /*采用二叉链表存储结构,Visit是对结点操作的应用函数。 后序遍历二叉树T,对每个结点调用函数Visit一次且一次。 一旦Visit()访问失败,则操作失败。*/ { if(T) { if(PostOrderTraverse(T->lchild,Visit)) if(PostOrderTraverse(T->rchild,Visit)) if(Visit(T->data)) return OK; return ERROR; } else return OK; }

Status LevelOrderTraverse( BiTree T,Status (*Visit)(TElemType e)) { /*采用二叉链表存储结构,Visit是对结点操作的应用函数。 层序遍历二叉树T,对每个结点调用函数Visit一次且一次。 一旦Visit()访问失败,则操作失败。*/ BiTree Qu[100]; int front,rear; front=1;rear=1; Qu[1]=T;rear++; while(front<rear && Qu[front]) { Visit(Qu[front]->data); if(Qu[front]->lchild) { Qu[rear++]=Qu[front]->lchild;} if(Qu[front]->rchild) { Qu[rear++]=Qu[front]->rchild;} front++; } return OK; } Status PrintElement(TElemType e) { printf("%5c ",e); return OK; } // //打印一个空格 void IndentBlanks(int num) { int i; for( i = 0;i < num; i++) printf(" "); }

Status PrintRNL(BiTree T,int level ) { //char *buffer; if(T) { PrintRNL(T->rchild,level+1); printf("\n"); IndentBlanks(level*6); printf("%c",T->data); PrintRNL(T->lchild,level+1); } return OK; }

void CountLeaf (BiTree T, int &count) { // use posorder descent if (T != NULL) { CountLeaf(T->lchild, count); // descend left CountLeaf(T->rchild, count); // descend right

// check if t is a leaf node (no descendants) // if so increment the variable count if (T->lchild == NULL && T->rchild == NULL) count++; } } void CountLink (BiTree T, int &count) { if (T != NULL) { if(T->lchild) CountLink(T->lchild, ++count); if(T->rchild) CountLink(T->rchild, ++count); }

} void CountLL (BiTree T, int &leaf,int &link1,int &link2) { if(T) { if(T->lchild && T->rchild) ++link2; else if(T->lchild && !T->rchild) ++link1; else if(T->rchild && !T->lchild) ++link1; else ++leaf; CountLL(T->lchild,leaf,link1,link2); CountLL(T->rchild,leaf,link1,link2); } }

int Depth (BiTree T) { int depthLeft, depthRight, depthval;

if (T == NULL) depthval = 0; else { depthLeft= Depth(T->lchild); depthRight= Depth(T->rchild); depthval = 1 + (depthLeft> depthRight?depthLeft:depthRight); } return depthval; }

Status InOrderTraverseF(BiTree T,Status(*Visit)(TElemType e)) { BiTNode p;//定义数据ElemType为结点 InitStack(S); p=*T; //如果结点的左域非空,结点进栈 while(p.lchild) { Push(S,p); p=*p.lchild; } while(&p) { Visit(p.data); //访问结点 if (p.rchild != NULL) { //当前结点置为右结点 p=*p.rchild; //如果结点的左域非空,结点进栈 while(p.lchild) { Push(S,p); p=*p.lchild; } } else if (!StackEmpty(S)) // move up the tree Pop(S,p); else return OK; } return OK;

}

Status PreOrderTraverseF( BiTree T,Status (*Visit)(TElemType e)) {

BiTNode p;//定义数据ElemType为结点 InitStack(S); p=*T; while(&p) { Visit(p.data); //访问结点 if(p.rchild) //右结点入栈 Push(S,*p.rchild); if (p.lchild != NULL) { //当前结点置为左结点 p=*p.lchild; } else if (!StackEmpty(S)) // move up the tree Pop(S,p); else return OK; } } Status PostOrderTraverseF( BiTree T,Status (*Visit)(TElemType e)) { BiTNode p;//定义数据ElemType为结点 int i=0; InitStack(S); p=*T; //如果结点的左域非空,结点进栈 while(p.lchild) { Push(S,p); p=*p.lchild; } Push(S,p); while(!StackEmpty(S)) { if (p.rchild != NULL && i!=1) { //当前结点置为右结点 p=*p.rchild; //如果结点的左域非空,结点进栈 while(p.lchild) { Push(S,p); p=*p.lchild; } Push(S,p); i=0; } else { Pop(S,p); i=0; Visit(p.data); } if (!StackEmpty(S)) // move up the tree { GetTop(S,p); i=1; } } return OK; }

搜索更多相关主题的帖子: 历算 define 递归 堆栈 环境 
2005-07-04 15:25
gowant
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2005-7-5
收藏
得分:0 
编程好难
2005-07-06 10:35
gowant
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2005-7-5
收藏
得分:0 
我要是高手就好了
2005-07-06 10:37
wendy85
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-7-23
收藏
得分:0 
请问以下啊, 这个程序要用到库函数"bitree.h"里的哪个小函数啊?谢谢!
2005-07-23 16:59
zhangyunfeng
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2005-7-25
收藏
得分:0 
这个后序遍历算法好像有问题

[此贴子已经被作者于2005-7-26 14:07:56编辑过]


2005-07-26 14:03
zhangyunfeng
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2005-7-25
收藏
得分:0 
if (!StackEmpty(S))     // move up the tree
    {
     GetTop(S,p);
     i=1;
    }
后p所指节点的右子树可能还没被访问,因i=1父节点就出栈了
2005-07-26 14:04
zhangyunfeng
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2005-7-25
收藏
得分:0 
欢迎拍砖
2005-07-26 14:07
快速回复:在此环境下,增加一个非递归后序遍历算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015477 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved