데이터 구조 이 진 트 리 의 옮 겨 다 니 기

5594 단어 데이터 구조
/**********************************************************************

        

(1)        

(2)      

(3)      :  ,  ,  

************************************************************************/

#include <cstdio>

#include <cstdlib>

const int MAX=20;

//              

typedef struct Node

{

	char ch;				 //    

	struct Node *plchild;    //     

	struct Node *prchild;	//     

}BiTreeNode;



//      

//1.                

// ABD#G##EH##I##CF#J###

void CreateBiTree_PreOrder(BiTreeNode * &T) //             

{	

	char ch;

	scanf("%c",&ch);

	if('#'==ch)

		T=NULL;

	else {

		T=new BiTreeNode;

		if(NULL==T)

			exit(-1);

		T->ch=ch;

		CreateBiTree_PreOrder(T->plchild); //      

		CreateBiTree_PreOrder(T->prchild); //      

	}

}

//2.                

/*  :a(b(c,d),e(f(,g),h(i)))

	'(':              ,  。         , flag=1  

	',':            。 flag=2  

	')':                ,     。

	default:     ,    ,      

 */

void CreateBiTree_ByString(BiTreeNode* &T, char str[])

{

	BiTreeNode* Stack[MAX];		//         

	int top=0,flag=0;

	BiTreeNode* p=NULL;			//      

	while(*str)

	{

		switch(*str)

		{

			case '(':

					Stack[top++]=p;

					flag=1;		//               

					break;

			case ',':

					flag=2;  //      	     

					break;

			case ')':

					--top;	//      

					break;

			default:

				{	

					p=new BiTreeNode;

					if(NULL==p)

						return  ;

					if(T==NULL)

						T=p;

					p->ch=*str;

					p->plchild=NULL;

					p->prchild=NULL;

					switch(flag) //   flag           

					{

						case 1:

							Stack[top-1]->plchild=p; //            

							break;

						case 2:

							Stack[top-1]->prchild=p; //            

							break;

					}

					break;

				}

		}

		++str;

	}

}

//       

void PreOrderTraverse_Recur(BiTreeNode *T)

{	

	if(T) 

	{

		printf("%2c",T->ch);

		PreOrderTraverse_Recur(T->plchild);

		PreOrderTraverse_Recur(T->prchild);

	}

}

//        

/*   :       ,  。      ,         ,      。

		           ,  NULL.          。    

 */

void PreOrderTraverse_NoRecur(BiTreeNode *T)

{

	BiTreeNode* Stack[MAX]; //            

	int top=0;

	BiTreeNode *p=T;

	while( p || top >0)

	{

		while(p)

		{

			printf("%2c",p->ch);	//   

			Stack[top++]=p;		//       

			p=p->plchild;		//       

		}

		if(top>0)	//top          

		{ //          

			p=Stack[--top];		//              NULL         。

			p=p->prchild;		//                 

		}

	}

}

//       

void InOrderTraverse_Recur(BiTreeNode *T)

{

	if(T)  //      NULL 

	{	

		InOrderTraverse_Recur(T->plchild); //        

		printf("%2c",T->ch);		   //         

		InOrderTraverse_Recur(T->prchild); //           

	}

}

//         

/*   :       (        ,                     )

		       ,         ,  NULL.            。

 */

void InorderTraverse_NoRecur(BiTreeNode *T)

{

	BiTreeNode* Stack[MAX];

	int top=0;

	BiTreeNode *p=T;

	while( p || top>0 )

	{

		while(p)

		{

			Stack[top++]=p;  //        

			p=p->plchild;	//        

		}

		if(top>0)

		{

			p=Stack[--top];		 //      

			printf("%2c",p->ch); //      

			p=p->prchild;		 //       

		}

	}

}

//       

void AfterOrderTraverse_Recur(BiTreeNode *T)

{

	if(T)

	{

		AfterOrderTraverse_Recur(T->plchild);

		AfterOrderTraverse_Recur(T->prchild);

		printf("%2c",T->ch);	

	}

}

//        

/*  :           。      NULL,        ,           

		    q                。

 */

void AfterOrderTraverse_NoRecur(BiTreeNode *T)

{

	BiTreeNode* Stack[MAX];

	int top=0;

	BiTreeNode *p=T,*q=NULL; // q            

	while(p || top>0)

	{

		while(p) //         

		{

			Stack[top++]=p;

			p=p->plchild; 

		}

		if(top>0)

		{

			p=Stack[top-1]; //           

			if(p->prchild==NULL || p->prchild == q) //               

			{

				printf("%2c",p->ch);

				q=p;

				p=NULL;

				top--;

			}

			else //           

				p=p->prchild;

		}

	}

	

}

//     

void DestoryBiTree(BiTreeNode* &T)

{

	if(T)

	{

		if(T->plchild)

			DestoryBiTree(T->plchild);

		if(T->prchild)

			DestoryBiTree(T->prchild);

		delete T;

		T=NULL;

	}

}

int main()

{//ABD#G##EH##I##CF#J###

	BiTreeNode *T=NULL;

	CreateBiTree_PreOrder(T);

	puts("      :");

	PreOrderTraverse_Recur(T);

	puts("");

	puts("       :");

	PreOrderTraverse_NoRecur(T);

	puts("");

	puts("      :");

	InOrderTraverse_Recur(T);

	puts("");

	puts("       :");

	InorderTraverse_NoRecur(T);

	puts("");

	puts("      :");

	AfterOrderTraverse_Recur(T);

	puts("");

	puts("       :");

	AfterOrderTraverse_NoRecur(T);

	puts("");

	DestoryBiTree(T);	//     

	puts("
-- ------------"); BiTreeNode *T2=NULL; char str[]="a(b(c,d),e(f(,g),h(i)))"; CreateBiTree_ByString(T2,str); puts(" :"); PreOrderTraverse_Recur(T2); puts(""); puts(" :"); PreOrderTraverse_NoRecur(T2); puts(""); puts(" :"); InOrderTraverse_Recur(T2); puts(""); puts(" :"); InorderTraverse_NoRecur(T2); puts(""); puts(" :"); AfterOrderTraverse_Recur(T2); puts(""); puts(" :"); AfterOrderTraverse_NoRecur(T2); puts(""); //DestoryBiTree(T2); // }

좋은 웹페이지 즐겨찾기