データ構造-ツリー-二叉のツリーは、完全に実行可能なコード(再帰的/非再帰的)を巡回します。
6078 ワード
データ構造-ツリー-二叉のツリーは、完全に実行可能なコード(再帰的/非再帰的)を巡回します。
mark:いいブログがあります。再帰アルゴリズムについて詳しく説明しています。先に記録しました。http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
mark:いいブログがあります。再帰アルゴリズムについて詳しく説明しています。先に記録しました。http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
//
typedef struct BitNode
{
char data;
struct BitNode* left,*right;
}BitTree;
//
typedef struct stackelem
{
BitTree* a[MAXSIZE];
int top;
}Stack;
//
typedef struct queueelem
{
BitTree* b[MAXSIZE];
int front,rear;
}Queue;
// ,
// 。 A # #(# )
BitTree* Create()
{
char ch;
scanf("%c",&ch);
getchar(); //
if (ch=='#')
{
return NULL;
}
else
{
BitTree* btree=(BitTree*)malloc(sizeof(BitTree));
if (NULL==btree)
{
return NULL;
}
btree->data=ch;
btree->left=Create();
btree->right=Create();
return btree;
}
}
// ,
void Preorder(BitTree* bt)
{
if (NULL!=bt)
{
printf("%c ",bt->data);
Preorder(bt->left);
Preorder(bt->right);
}
}
//
/*
: ; , , , , , ; , ( ),
, , ( )... , 。
*/
void Preorder2(BitTree* bt)
{
BitTree* p;
Stack st;
st.top=-1;
if (NULL==bt)
{
return;
}
else
{
st.top++;
st.a[st.top]=bt;
while (st.top!=-1)
{
p=st.a[st.top];
st.top--;
printf("%c ",p->data);
if (p->right!=NULL)
{
st.top++;
st.a[st.top]=p->right;
}
if (p->left!=NULL)
{
st.top++;
st.a[st.top]=p->left;
}
}
}
}
// ,
void Inorder(BitTree* bt)
{
if (NULL!=bt)
{
Inorder(bt->left);
printf("%c ",bt->data);
Inorder(bt->right);
}
}
// ,
/*
: 。 , , , 。 , ,
, 。 , , , ;
, ; , , , ; , ,
, 。 ....
, 。
*/
void Inorder2(BitTree* bt)
{
BitTree* p,*q;
Stack st;
st.top=-1;
if (NULL==bt)
{
return;
}
else
{
while (bt!=NULL)
{
st.top++;
st.a[st.top]=bt;
bt=bt->left;
}
while (st.top!=-1)
{
p=st.a[st.top];
st.top--;
printf("%c ",p->data);
while ( p->right!=NULL )
{
st.top++;
st.a[st.top]=p->right;
q=p->right;
while (q->left!=NULL)
{
st.top++;
st.a[st.top]=q->left;
q=q->left;
}
break;
}
}
}
}
// ,
void Postorder(BitTree* bt)
{
if (bt!=NULL)
{
Postorder(bt->left);
Postorder(bt->right);
printf("%c ",bt->data);
}
}
// ,
/*
: 。 , , , 。 ( , ),
1: , , ( , ), ,
, 。
2: , , , , 。
*/
void Postorder2(BitTree* bt)
{
Stack st;
st.top=-1;
BitTree* t;
do
{
while (bt!=NULL)
{
st.top++;
st.a[st.top]=bt;
bt=bt->left;
}
t=NULL;
while (st.top!=-1)
{
bt=st.a[st.top];
if (bt->right==t) //t: null, 。
{
printf("%c ",bt->data);
st.top--;
t=bt; //t
}
else
{
bt=bt->right;
break;
}
}
} while (st.top!=-1);
}
// ,
int Height(BitTree* bt)
{
int depth1,depth2;
if (NULL==bt)
{
return 0;
}
else
{
depth1=Height(bt->left);
depth2=Height(bt->right);
if (depth1>depth2)
{
return (depth1+1);
}
else
{
return (depth2+1);
}
}
}
// ,
void TraversalOfLevel(BitTree* bt)
{
Queue q;
q.front=q.rear=0;
if (bt!=NULL)
{
printf("%c ",bt->data);
}
q.b[q.front]=bt;
q.rear=q.rear+1;
while (q.front<q.rear)
{
bt=q.b[q.front];
q.front=q.front+1;
if (bt->left!=NULL)
{
printf("%c ",bt->left->data);
q.b[q.rear]=bt->left;
q.rear=q.rear+1;
}
if (bt->right!=NULL)
{
printf("%c ",bt->right->data);
q.b[q.rear]=bt->right;
q.rear=q.rear+1;
}
}
}
int main()
{
BitTree* btr=Create();
printf(" : :
");
Preorder(btr);
printf("
");
Preorder2(btr);
printf("
");
printf(" : :
");
Inorder(btr);
printf("
");
Inorder2(btr);
printf("
");
printf(" : :
");
Postorder(btr);
printf("
");
Postorder2(btr);
printf("
");
printf(" :
");
int Hgt=Height(btr);
printf("%d
",Hgt);
printf(" :
");
TraversalOfLevel(btr);
printf("
");
return 0;
}
/* :
d b a # # c # # f e # # g # #
: :
d b a c f e g
d b a c f e g
: :
a b c d e f g
a b c d e f g
: :
a c b e g f d
a c b e g f d
:
3
:
d b f a c e g
*/
勉強の途中で、君と一緒に勉強します。