您的位置:首页 > 其它

二叉树的创建遍历-递归与非递归

2014-04-06 14:48 260 查看
#include<iostream>

#include<stdio.h>

#include<malloc.h>

#include<stack>

#include<queue>

#define MaxSize 105

using namespace std;

typedef char ElemType;

struct BTNode

{

ElemType data;

struct BTNode *lchild;

struct BTNode *rchild;

};

void CreateBTNode(BTNode *&b,char *str)

{

BTNode *St[MaxSize],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL;

ch=str[j];

while(ch!='\0')

{

switch(ch)

{

case '(':

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];

}

}

void DispBTNode(BTNode *b)

{

if(b==NULL)

return ;

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 PreOrder(BTNode *root)

{

if(root==NULL)

return ;

printf("%c ",root->data);

PreOrder(root->lchild);

PreOrder(root->rchild);

}

void PreOrder1(BTNode *root)

{

stack<BTNode *> s;

BTNode *p=root;

while(p!=NULL||!s.empty())

{

while(p)

{

printf("%c",p->data);

s.push(p);

p=p->lchild;

}

if(!s.empty())

{

p=s.top();

s.pop();

p=p->rchild;

}

}

printf("\n");

}

void InOrder(BTNode *root)

{

if(root==NULL)

return ;

InOrder(root->lchild);

printf("%c ",root->data);

InOrder(root->rchild);

}

void InOrder1(BTNode *root)

{

stack<BTNode *> s;

BTNode *p=root;

while(p!=NULL||!s.empty())

{

while(p)

{

s.push(p);

p=p->lchild;

}

if(!s.empty())

{

p=s.top();

s.pop();

printf("%c ",p->data);

p=p->rchild;

}

}

printf("\n");

}

void PostOrder(BTNode *root)

{

if(root==NULL)

return ;

PostOrder(root->lchild);

PostOrder(root->rchild);

printf("%c ",root->data);

}

void PostOrder1(BTNode *root)

{

stack<BTNode *> s;

BTNode *cur=NULL;

BTNode *pre=NULL;

s.push(root);

while(!s.empty())

{

cur=s.top();

if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))

{

printf("%c ",cur->data);

s.pop();

pre=cur;

}else

{

if(cur->rchild)

s.push(cur->rchild);

if(cur->lchild)

s.push(cur->lchild);

}

}

printf("\n");

}

void LevelOrder(BTNode *root)

{

queue<BTNode *> Q;

BTNode *now;

Q.push(root);

while(!Q.empty())

{

now=Q.front();

Q.pop();

printf("%c ",now->data);

if(now->lchild)

Q.push(now->lchild);

if(now->rchild)

Q.push(now->rchild);

}

printf("\n");

}

int main(int argc,char *argv[])

{

freopen("input.txt","r",stdin);

BTNode *b;

char str[2*MaxSize];

scanf("%s",str);

CreateBTNode(b,str);

DispBTNode(b);

printf("\n");

PostOrder1(b);

LevelOrder(b);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: