主题:数据结构问题请教!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define maxsize 20
typedef struct bi{
int data;
struct bi * left,* right;
} bi_node ,*bi_tree;
void init_bitree(bi_tree & t){
t=NULL;
}
void creat_bitree(bi_tree & t){
int a;
scanf("%d",&a);
if(a==0){
t=NULL;
}
else
{ if(!(t=(bi_tree) malloc(sizeof(bi_node)))) exit(1);
t->data=a;
creat_bitree(t->left);
creat_bitree(t->right);
}
}
//stack test
//静态栈
typedef bi_tree datatype;
typedef struct stack_node{
datatype *top;
datatype *base;
} stack;
void init_stack(stack &s){
s.base=(datatype *)malloc(maxsize*sizeof(datatype));
if(!s.base){
printf("error init_stack");
exit(1);
}
else
{
s.top=s.base;
}
}
void clear_stack(stack & s){
s.top=s.base;
}
void destroy_stack(stack & s){
s.base=NULL;
s.top=NULL;
}
bool is_empty_stack(stack s){
return (s.top==s.base);
}
bool is_full_stack(stack s){
return (s.top>=s.base+maxsize);
}
void push(stack & s,datatype e){
if(is_full_stack(s)){
printf(" this stack is full");
exit(1);
}
else
{
*(s.top++)=e;
}
}
void pop(stack &s,datatype & e){
if(is_empty_stack(s)){
printf("this stack is empty");
exit(1);
}
else
{
e=*(--s.top);
}
}
void print(stack s){
datatype * x;
x=s.top;
do{
printf("%4d",*(--x));
}while(x!=s.base);
printf("\n");
}
void get_top_stack(stack s, datatype & e){
if(is_empty_stack(s)){
printf("error get_top_stack");
exit(1);
}
else
{
e=*(s.top-1);
}
}
//先序遍历
void pre(bi_tree t){
stack s;
init_stack(s);
bi_tree mid;
if(t){
printf("%4d",t->data);
push(s,t);
while(!is_empty_stack(s)){
get_top_stack(s,mid);
// printf("%4d",mid->data);
while(mid->left){
printf("%4d",mid->left->data);
push(s,mid->left);
get_top_stack(s,mid);
}
// printf("%4d",mid->data);
pop(s,mid);
if(s.top!=s.base)
(*(s.top-1))->left=NULL;
if(mid->right)
{
printf("%4d",mid->right->data);
push(s,mid->right);
}
}
}
destroy_stack(s);
}
void in(bi_tree t){
stack s;
datatype mid;
init_stack(s);
push(s,t);
while(!is_empty_stack(s)){
get_top_stack(s,mid);
while( mid){
push(s,mid->left);
get_top_stack(s,mid);}
pop(s,mid);
if(!is_empty_stack(s)){
pop(s,mid);
printf("%4d",mid->data);
push(s,mid->right);
}
}
destroy_stack(s);
}
void post(bi_tree t){
stack s;
bi_tree mid;
init_stack(s);
push(s,t);
while(!is_empty_stack(s) ){
get_top_stack(s,mid);
while(mid){
push(s,mid->left);
get_top_stack(s,mid);
}
pop(s,mid);//退出没有用的节点
if (!is_empty_stack(s)){
get_top_stack(s,mid);
if(mid->right){
push(s,mid->right);
if(mid->right->left==NULL && mid->right->right==NULL)
{
pop(s,mid);
printf("%4d",mid->data);
(*(s.top-1))->right=NULL;
}
}
else
{ //bi_tree mid1;
pop(s,mid);
printf("%4d",mid->data);
// get_top_stack(s,mid1);
if(s.top!=s.base){
if((*(s.top-1))->right && (*(s.top-1))->right->data==mid->data)
(*(s.top-1))->right=NULL;
else
(*(s.top-1))->left=NULL;
}
}
}
}
destroy_stack(s);
}
void main(){
bi_tree t;
init_bitree(t);
creat_bitree(t);
printf("先序遍历:");
preorder(t);
printf("\n");
printf("中序遍历:");
inorder(t);
printf("\n");
printf("后序遍历:");
postorder(t);
printf("\n");
printf("先序遍历:");
pre(t);
printf("\n");
printf("中序遍历:");
in(t);
printf("\n");
printf("后序遍历:");
post(t);
printf("\n");
}
为什么在非递归遍历时,如果不执行非递归前序遍历时,中序与后序正确,但是如果执行前序时,后序遍历,中序遍历就遍历不完全了?请问高手是什么原因!谢谢
#include<stdlib.h>
#include<malloc.h>
#define maxsize 20
typedef struct bi{
int data;
struct bi * left,* right;
} bi_node ,*bi_tree;
void init_bitree(bi_tree & t){
t=NULL;
}
void creat_bitree(bi_tree & t){
int a;
scanf("%d",&a);
if(a==0){
t=NULL;
}
else
{ if(!(t=(bi_tree) malloc(sizeof(bi_node)))) exit(1);
t->data=a;
creat_bitree(t->left);
creat_bitree(t->right);
}
}
//stack test
//静态栈
typedef bi_tree datatype;
typedef struct stack_node{
datatype *top;
datatype *base;
} stack;
void init_stack(stack &s){
s.base=(datatype *)malloc(maxsize*sizeof(datatype));
if(!s.base){
printf("error init_stack");
exit(1);
}
else
{
s.top=s.base;
}
}
void clear_stack(stack & s){
s.top=s.base;
}
void destroy_stack(stack & s){
s.base=NULL;
s.top=NULL;
}
bool is_empty_stack(stack s){
return (s.top==s.base);
}
bool is_full_stack(stack s){
return (s.top>=s.base+maxsize);
}
void push(stack & s,datatype e){
if(is_full_stack(s)){
printf(" this stack is full");
exit(1);
}
else
{
*(s.top++)=e;
}
}
void pop(stack &s,datatype & e){
if(is_empty_stack(s)){
printf("this stack is empty");
exit(1);
}
else
{
e=*(--s.top);
}
}
void print(stack s){
datatype * x;
x=s.top;
do{
printf("%4d",*(--x));
}while(x!=s.base);
printf("\n");
}
void get_top_stack(stack s, datatype & e){
if(is_empty_stack(s)){
printf("error get_top_stack");
exit(1);
}
else
{
e=*(s.top-1);
}
}
//先序遍历
void pre(bi_tree t){
stack s;
init_stack(s);
bi_tree mid;
if(t){
printf("%4d",t->data);
push(s,t);
while(!is_empty_stack(s)){
get_top_stack(s,mid);
// printf("%4d",mid->data);
while(mid->left){
printf("%4d",mid->left->data);
push(s,mid->left);
get_top_stack(s,mid);
}
// printf("%4d",mid->data);
pop(s,mid);
if(s.top!=s.base)
(*(s.top-1))->left=NULL;
if(mid->right)
{
printf("%4d",mid->right->data);
push(s,mid->right);
}
}
}
destroy_stack(s);
}
void in(bi_tree t){
stack s;
datatype mid;
init_stack(s);
push(s,t);
while(!is_empty_stack(s)){
get_top_stack(s,mid);
while( mid){
push(s,mid->left);
get_top_stack(s,mid);}
pop(s,mid);
if(!is_empty_stack(s)){
pop(s,mid);
printf("%4d",mid->data);
push(s,mid->right);
}
}
destroy_stack(s);
}
void post(bi_tree t){
stack s;
bi_tree mid;
init_stack(s);
push(s,t);
while(!is_empty_stack(s) ){
get_top_stack(s,mid);
while(mid){
push(s,mid->left);
get_top_stack(s,mid);
}
pop(s,mid);//退出没有用的节点
if (!is_empty_stack(s)){
get_top_stack(s,mid);
if(mid->right){
push(s,mid->right);
if(mid->right->left==NULL && mid->right->right==NULL)
{
pop(s,mid);
printf("%4d",mid->data);
(*(s.top-1))->right=NULL;
}
}
else
{ //bi_tree mid1;
pop(s,mid);
printf("%4d",mid->data);
// get_top_stack(s,mid1);
if(s.top!=s.base){
if((*(s.top-1))->right && (*(s.top-1))->right->data==mid->data)
(*(s.top-1))->right=NULL;
else
(*(s.top-1))->left=NULL;
}
}
}
}
destroy_stack(s);
}
void main(){
bi_tree t;
init_bitree(t);
creat_bitree(t);
printf("先序遍历:");
preorder(t);
printf("\n");
printf("中序遍历:");
inorder(t);
printf("\n");
printf("后序遍历:");
postorder(t);
printf("\n");
printf("先序遍历:");
pre(t);
printf("\n");
printf("中序遍历:");
in(t);
printf("\n");
printf("后序遍历:");
post(t);
printf("\n");
}
为什么在非递归遍历时,如果不执行非递归前序遍历时,中序与后序正确,但是如果执行前序时,后序遍历,中序遍历就遍历不完全了?请问高手是什么原因!谢谢