设为首页 加入收藏

TOP

二叉树遍历的非递归实现
2015-03-06 01:05:20 来源: 作者: 【 】 浏览:47
Tags:实现

二叉树的非递归实现需要使用到下推栈,下面给出前序遍历的完整代码:


#include
#include
#define MAX? 10



//二叉树存储结构定义
typedef char Item;
typedef struct node *link;
struct node {Item item; link l, r;};


int? Create(link *tp);
void show(link h);
void tranverse(link h, void (*visit)(link));


//下推栈存储结构定义
typedef link SItem;
static SItem *s;
static int? ? N;


void? STACKinit(int maxN);
int? STACKempty();
void? STACKpush(SItem item);
SItem STACKpop();



int main()
{
? ? link tree;


? ? Create(&tree);
? ? tranverse(tree, show);


? ? return 0;
}


void STACKinit(int maxN)
{
? ? s = (SItem *)malloc(maxN * sizeof(SItem));
? ? if (!s) return;
? ? N = 0;
}


int STACKempty()
{
? ? return N==0;
}


void STACKpush(SItem item)
{
? ? s[N++] = item;
}


SItem STACKpop()
{
? ? return s[--N];
}


int Create(link *tp)
{
? ? //构造方法,或者说构造顺序:中序遍历构造
? ? char x;
? ? scanf("%c",&x);
? ? if(x=='#')
? ? {
? ? ? ? *tp=NULL;//指针为空,树节点中的某个指针为空
? ? ? ? return 0;
? ? }
? ? *tp=(link)malloc(sizeof(**tp));//将树节点中指针指向该地址空间
? ? if(*tp==NULL)
? ? ? ? return 0;
? ? (*tp)->item=x;
? ? Create(&((*tp)->l));
? ? Create(&((*tp)->r));
? ? return 1;
}


void show(link h)
{
? ? printf(" %c ", h->item);
}


//前序遍历
void tranverse(link h, void (*visit)(link))
{
? ? STACKinit(MAX);
? ? STACKpush(h);
? ? while (!STACKempty()){
? ? ? ? (*visit)(h = STACKpop());
? ? ? ? if (h->r != NULL) STACKpush(h->r);
? ? ? ? if (h->l != NULL) STACKpush(h->l);
? ? }
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇QWT的编译与配置 下一篇Android NDK处理用户交互事件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: