二叉树的先序遍历的非递归算法
直接上代码(用栈实现)
语言(c++)
#include <iostream>
#include "btree.h"
#include <stdio.h>
using namespace std;
int main()
{
BTNode *p,*q;
char str[MaxSize],m;
printf("\n(1)创建二叉树,请以括号表示法输入二叉树:\n");
gets(str);
CreateBTNode(p,str);
printf("\n(2)输出二叉树:\n");
DispBTNode(p);
printf("\n(3)请输入要查找的结点:");
scanf("%c",&m);
q=FindNode(p,m);
if(q->lchild==NULL)
{
printf(" 无左孩子 ");
}
else
{
printf(" 有左孩子 ");
}
if(q->rchild==NULL)
{
printf(" 无右孩子 ");
}
else
{
printf(" 有右孩子 ");
}
printf("\n(4)二叉树深度:%d\n",BTNodeDepth(p));
printf("\n(5)先序遍历非递归算法结果:");
DispBTNodeBefore(p);
printf("\n(6)释放二叉树");
}
头文件:
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
typedef struct
{
BTNode *data[MaxSize];
int top;
} SqStack;
void CreateBTNode(BTNode *&b,char *str);
BTNode *FindNode(BTNode *b,ElemType x);
BTNode *LchildNode(BTNode *p);
BTNode *RchildNode(BTNode *p);
int BTNodeDepth(BTNode *b);
void DispBTNode(BTNode *b);
void DestroyBTNode(BTNode *&b);
void InitStack(SqStack *&s);
void DestroyStack(SqStack *&s);
bool StackEmpty(SqStack *s);
int StackLength(SqStack *s);
bool Push(SqStack *&s,BTNode * e);
bool Pop(SqStack *&s,BTNode * &e);
bool GetTop(SqStack *s,BTNode * &e);
void DispStack(SqStack *s);
void DispBTNodeBefore(BTNode *b);
源文件:
#include <stdio.h>
#include <malloc.h>
#include "btree.h"
void CreateBTNode(BTNode *&b,char *str)
{
BTNode *St[MaxSize],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
printf("创建成功!\n");
}
BTNode *FindNode(BTNode *b,ElemType x)
{
BTNode *p;
if (b==NULL)
return NULL;
else if (b->data==x)
return b;
else
{
p=FindNode(b->lchild,x);
if (p!=NULL)
return p;
else
return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if (b==NULL)
return(0);
else
{
lchilddep=BTNodeDepth(b->lchild);
rchilddep=BTNodeDepth(b->rchild);
return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
}
}
void DispBTNode(BTNode *b)
{
if (b!=NULL)
{
printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
DispBTNode(b->rchild);
printf(")");
}
}
}
void DestroyBTNode(BTNode *&b)
{
if (b!=NULL)
{
DestroyBTNode(b->lchild);
DestroyBTNode(b->rchild);
free(b);
}
}
void DispBTNodeBefore(BTNode *b){
BTNode *p;
SqStack *st;
InitStack(st);
if(b!=NULL){
Push(st,b);
while(!StackEmpty(st)){
Pop(st,p);
printf("%c ",p->data);
if(p->rchild!=NULL){
Push(st,p->rchild);
}
if(p->lchild!=NULL){
Push(st,p->lchild);
}
}
}
DestroyStack(st);
}
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
void DestroyStack(SqStack *&s)
{
free(s);
}
int StackLength(SqStack *s)
{
return(s->top+1);
}
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,BTNode * e)
{
if(s->top==MaxSize-1){
return false;
}else{
s->top=s->top+1;
s->data[s->top]=e;
return true;
}
}
bool Pop(SqStack *&s,BTNode * &e)
{
e=s->data[s->top];
s->top=s->top-1;
if(StackEmpty(s)){
return false;
}else{
return true;
}
}
bool GetTop(SqStack *s,BTNode * &e)
{
if (s->top==-1)
return false;
e=s->data[s->top];
return true;
}
点个赞吧,哈哈哈