二叉树的创建遍历-递归与非递归
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;
}
#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;
}
相关文章推荐
- 删除向量中所有的X
- ubuntu 下设置系统默认搜索路径的方法
- android项目中配置NDK自动编译生成so文件
- 2014第14周日
- 创建android Notification
- tabpanel note
- MVP的PV模式与SC模式
- cacti使用
- 关于EL表达式中requestScope和param区别
- C++模板编程->元编程(1)
- C++模板编程->元编程(1)
- C++学习之链表
- Java算法求最大最小值,冒泡排序,斐波纳契数列,日历一些经典算法
- Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>
- AOJ 673 聪明的输入法
- Java代码实现apk自动化解包和压包
- 【Emacs配置Python IDE】Configuring Emacs as a Python IDE
- java代码生成器
- 关于mysql外键创建失败的问题
- [jQuery]EasyUI中DataGrid获取数据并分页