1. 程式人生 > >二叉樹應用

二叉樹應用

#include<stdio.h>
#include<stdlib.h>

#define OK 			1
#define ERROR 		0
#define MAXSIZE 	50
#define OVERFLOW	-1

typedef int Status; 
typedef char TElemType;
char m;
typedef struct BiTNode
{
	TElemType		data;
	struct BiTNode	*lchild, *rchild; 				
} BiTNode, *BiTree;


Status InitBiTree(BiTree &T)						//構造空二叉樹T
{ 
	T=NULL;
	return OK;
}

void DestroyBiTree(BiTree &T)						//後序銷燬二叉樹T
{ 
	if(T)
	{
    	if(T->lchild) DestroyBiTree(T->lchild); 	
     	if(T->rchild) DestroyBiTree(T->rchild); 	
     	free(T); 										
     	T=NULL; 											
   	}
}

void CreateBiTree(BiTree &T)						//先序建立二叉樹 
{ 
   	TElemType	ch;
   	scanf("%c",&ch);
   	if(ch==' ') T=NULL;
   	else
	{
     	T=(BiTNode *)malloc(sizeof(BiTNode));
     	if(!T) exit(OVERFLOW);
    	T->data=ch; 										
    	CreateBiTree(T->lchild); 					
     	CreateBiTree(T->rchild); 					
  	}
}

void PreOrderTraverse(BiTree T)						// 先序遍歷遞迴 
{ 
	if(T)
	{
     	printf("%c ",T->data); 							
     	PreOrderTraverse(T->lchild);				 	
     	PreOrderTraverse(T->rchild); 			
   	}
}

void InOrderTraverse(BiTree T)						// 中序遍歷遞迴 
{
   	if(T)
	{
    	 InOrderTraverse(T->lchild);  		
    	 printf("%c ",T->data); 					
    	 InOrderTraverse(T->rchild);  			
   	}
}

void PostOrderTraverse(BiTree T)					// 後序遍歷遞迴 
{
   if(T)
   {
     	PostOrderTraverse(T->lchild); 	
   	  PostOrderTraverse(T->rchild); 		
    	 printf("%c ",T->data);  				
   }
}


// 中序遍歷非遞迴遍歷演算法
void InOrderTraversal_NoRecursion( BiTNode *T )
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		// T為空指標或者棧為空時終止。棧中不壓入空指標。
		{
		    while(T)						// 一直向左並將沿途結點壓入堆疊
		    {   
		        Stack[++top] = T; 
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				    T=Stack[top--]; 									// 結點彈出堆疊
				    printf("%c ",T->data); 						//(訪問)列印結點
				    T=T->rchild; 											// 轉向右子樹
		    }
		}
				
}

void find(BiTree T)
{
	if(T)
	{
     	if(T->data==m)
		{
			if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n");
			else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data);
			else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c  沒有右孩子\n",T->lchild->data);
			else 
			{
				printf("左孩子 %c ",T->lchild->data);
				printf("右孩子 %c \n",T->rchild->data);
			}
		}						
     	find(T->lchild);				 	
     	find(T->rchild); 			
   	}
}						
 
void PreOrdershow(BiTree T)						// 先序遍歷廣義表輸出 
{ 
	if(T)
	{	 
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
			return;
		}
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf("%c(",T->data); 
		}
		
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
		}
		PreOrdershow(T->lchild); 
		if(T->rchild!=NULL)
		{
			printf(",");
		}
		PreOrdershow(T->rchild);
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf(")");
		}		
									
   	}
}

void PreOrdershow1(BiTree T)  				//先序遍歷廣義表輸出 高階寫法  又上一個總結到這個 
{
	if(T)
	{
		printf("%c",T->data);
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf("(");
			DispBTree(T->lchild);
			if(T->rchild!=NULL) printf(",");
			DispBTree(T->rchild);
			printf(")");
		}
	}
}

int max(int a, int b)
{
	return a>=b ? a : b;
}

int	BTree_Height(BiTree T)											//高度 
{
	if(T==NULL)
		return	0;
	else
		if(T->lchild==NULL && T->rchild==NULL)
			return	1;
		else
			return	1+max(BTree_Height(T->lchild),BTree_Height(T->rchild));
}

void PreOrderPrintLeaves(BiTree T)			// 輸出葉子結點值
{
    if(T) 
    {
        if(T->lchild==NULL && T->rchild==NULL)
    		printf("%c ",T->data );
        PreOrderPrintLeaves (T->lchild);
        PreOrderPrintLeaves (T->rchild);
    }
}


int	main()
{
	BiTree	root; 
	printf("建立二叉樹\n");
	InitBiTree(root);
	CreateBiTree(root);
	printf("\n");
	
	printf("輸出二叉樹\n");//"ABD  EHJ  KL  M N   CF  G I  " 
	PreOrdershow(root);printf("\n");
	PreOrdershow1(root);
	printf("\n\n");

	printf("查詢H節點\n");
	m='H';
	find(root);
	printf("\n\n");
	
	printf("二叉樹高度\n");
	printf("%d",BTree_Height(root));
	printf("\n\n");
	
	printf("釋放二叉樹\n");
	DestroyBiTree(root);			
}
#include<stdio.h>
#include<stdlib.h>

#define OK 			1
#define ERROR 		0
#define MAXSIZE 	50
#define OVERFLOW	-1

typedef int Status; 
typedef char TElemType;
char m;
typedef struct BiTNode
{
	TElemType		data;
	struct BiTNode	*lchild, *rchild; 				
} BiTNode, *BiTree;


Status InitBiTree(BiTree &T)						//構造空二叉樹T
{ 
	T=NULL;
	return OK;
}

void DestroyBiTree(BiTree &T)						//後序銷燬二叉樹T
{ 
	if(T)
	{
    	if(T->lchild) DestroyBiTree(T->lchild); 	
     	if(T->rchild) DestroyBiTree(T->rchild); 	
     	free(T); 										
     	T=NULL; 											
   	}
}

void CreateBiTree(BiTree &T)						//先序建立二叉樹 
{ 
   	TElemType	ch;
   	scanf("%c",&ch);
   	if(ch==' ') T=NULL;
   	else
	{
     	T=(BiTNode *)malloc(sizeof(BiTNode));
     	if(!T) exit(OVERFLOW);
    	T->data=ch; 										
    	CreateBiTree(T->lchild); 					
     	CreateBiTree(T->rchild); 					
  	}
}

void PreOrderTraverse(BiTree T)						// 先序遍歷遞迴 
{ 
	if(T)
	{
     	printf("%c ",T->data); 							
     	PreOrderTraverse(T->lchild);				 	
     	PreOrderTraverse(T->rchild); 			
   	}
}

void InOrderTraverse(BiTree T)						// 中序遍歷遞迴 
{
   	if(T)
	{
    	 InOrderTraverse(T->lchild);  		
    	 printf("%c ",T->data); 					
    	 InOrderTraverse(T->rchild);  			
   	}
}

void PostOrderTraverse(BiTree T)					// 後序遍歷遞迴 
{
	if(T)
	{
    	 PostOrderTraverse(T->lchild); 	
    	 PostOrderTraverse(T->rchild); 		
    	 printf("%c ",T->data);  				
  	}
}

void PreOrderTraverse_NoRecursion(BiTNode *T)				// 先序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		
		{
		    while(T)					
		    {   
		        Stack[++top]=T;
				printf("%c ",T->data);  
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				T=Stack[top--]; 								
				T=T->rchild; 										
		    }
		}
				
}

void InOrderTraversal_NoRecursion(BiTNode *T)				// 中序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		// T為空指標或者棧為空時終止。棧中不壓入空指標。
		{
		    while(T)						// 一直向左並將沿途結點壓入堆疊
		    {   
		        Stack[++top]=T; 
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				T=Stack[top--]; 									// 結點彈出堆疊
				printf("%c ",T->data); 								//(訪問)列印結點
				T=T->rchild; 										// 轉向右子樹
		    }
		}
				
}

void PostOrderTraversal_NoRecursion(BiTNode *T)				// 後序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int Stack1[MAXSIZE];
		int	 top=-1;int tag;				
		while(T || (top!=-1))		
		{
		    while(T)						
		    {   
		        Stack[++top]=T;
				tag=0;
				Stack1[top]=tag;
		        T=T->lchild; 
		    }	
			if(Stack1[top]==0)
			{
				tag=1;
				Stack1[top]=tag;
				T=Stack[top]->rchild;
			}
			else
			{
				T=Stack[top];
				top--;
				printf("%c ",T->data);
				T=NULL; 	
			}	    
		   
		}
				
}

void LevelorderTraverse(BiTNode *T)
{  
	BiTNode *Queue[MAXSIZE];
	int front=0,rear=0;
	if(T) 
	{ 
		Queue[++rear]=T;    							/*   根結點入隊  */
		while(front<rear)
	    {  
			T=Queue[++front];  
			printf("%c ",T->data);
	        if(T->lchild!=NULL)
	            Queue[++rear]=T->lchild;   			 /*   左結點入隊  */
	        if(T->rchild!=NULL)
	            Queue[++rear]=T->rchild;   			 /*   右結點入隊  */
	    }
	      
	}
}


void find(BiTree T)
{
	if(T)
	{
     	if(T->data==m)
		{
			if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n");
			else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data);
			else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c  沒有右孩子\n",T->lchild->data);
			else 
			{
				printf("左孩子 %c ",T->lchild->data);
				printf("右孩子 %c \n",T->rchild->data);
			}
		}						
     	find(T->lchild);				 	
     	find(T->rchild); 			
   	}
}						
 
void PreOrdershow(BiTree T)						// 先序遍歷廣義表輸出 
{ 
	if(T)
	{	 
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
			return;
		}
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf("%c(",T->data); 
		}
		
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
		}
		PreOrdershow(T->lchild); 
		if(T->rchild!=NULL)
		{
			printf(",");
		}
		PreOrdershow(T->rchild);
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
				printf(")");
		}		
		
		
					
   	}
}

int max(int a, int b)
{
	return a>=b ? a : b;
}

int	BTree_Height(BiTree T)											//高度 
{
	if(T==NULL)
		return	0;
	else
		if(T->lchild==NULL && T->rchild==NULL)
			return	1;
		else
			return	1+max(BTree_Height(T->lchild),BTree_Height(T->rchild));
}

void PreOrderPrintLeaves(BiTree T)			// 輸出葉子結點值
{
    if(T) 
    {
        if(T->lchild==NULL && T->rchild==NULL)
    		printf("%c ",T->data );
        PreOrderPrintLeaves (T->lchild);
        PreOrderPrintLeaves (T->rchild);
    }
}


int	main()
{
	BiTree	root; 
	printf("建立二叉樹\n");
	InitBiTree(root);
	CreateBiTree(root);

	printf("輸出二叉樹\n");//"ABD  EHJ  KL  M N   CF  G I  " 
	PreOrdershow(root);
	printf("\n");

	printf("層次遍歷二叉樹-遞迴\n");
	 LevelorderTraverse(root);
	printf("\n");
	
	printf("先序遍歷二叉樹-遞迴\n");
	PreOrderTraverse(root);
	printf("\n");
	printf("先序遍歷二叉樹-非遞迴\n");
	PreOrderTraverse_NoRecursion(root);
	printf("\n");
	
	printf("中序遍歷二叉樹-遞迴\n");
	InOrderTraverse(root);
	printf("\n");
	printf("中序遍歷二叉樹-非遞迴\n");
	InOrderTraversal_NoRecursion(root);
	printf("\n");
	
	printf("後序遍歷二叉樹-遞迴\n");
	PostOrderTraverse(root);
	printf("\n");
	printf("後序遍歷二叉樹-非遞迴\n");
	PostOrderTraversal_NoRecursion(root); 
	printf("\n");
	
	printf("釋放二叉樹\n");
	DestroyBiTree(root);	
	printf("\n");		
}
#include<stdio.h>
#include<stdlib.h>

#define OK 			1
#define ERROR 		0
#define MAXSIZE 	50
#define OVERFLOW	-1

typedef int Status; 
typedef char TElemType;
int level;
char m;
typedef struct BiTNode
{
	TElemType		data;
	struct BiTNode	*lchild, *rchild; 				
} BiTNode, *BiTree;


Status InitBiTree(BiTree &T)						//構造空二叉樹T
{ 
	T=NULL;
	return OK;
}

void DestroyBiTree(BiTree &T)						//後序銷燬二叉樹T
{ 
	if(T)
	{
    	if(T->lchild) DestroyBiTree(T->lchild); 	
     	if(T->rchild) DestroyBiTree(T->rchild); 	
     	free(T); 										
     	T=NULL; 											
   	}
}

void CreateBiTree(BiTree &T)						//先序建立二叉樹 
{ 
   	TElemType	ch;
   	scanf("%c",&ch);
   	if(ch==' ') T=NULL;
   	else
	{
    	T=(BiTNode *)malloc(sizeof(BiTNode));
     	if(!T) exit(OVERFLOW);
    	T->data=ch; 										
    	CreateBiTree(T->lchild); 					
     	CreateBiTree(T->rchild); 					
  	}
}

void PreOrderTraverse(BiTree T)						// 先序遍歷遞迴 
{ 
	if(T)
	{
     	printf("%c ",T->data); 							
     	PreOrderTraverse(T->lchild);				 	
     	PreOrderTraverse(T->rchild); 			
   	}
}

void InOrderTraverse(BiTree T)						// 中序遍歷遞迴 
{
   	if(T)
	{
    	 InOrderTraverse(T->lchild);  		
    	 printf("%c ",T->data); 					
    	 InOrderTraverse(T->rchild);  			
   	}
}

void PostOrderTraverse(BiTree T)					// 後序遍歷遞迴 
{
   if(T)
   {
     	PostOrderTraverse(T->lchild); 	
     	PostOrderTraverse(T->rchild); 		
     	printf("%c ",T->data);  				
   }
}

void PreOrderTraverse_NoRecursion(BiTNode *T)				// 先序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		
		{
		    while(T)					
		    {   
		        Stack[++top]=T;
				printf("%c ",T->data);  
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				T=Stack[top--]; 								
				T=T->rchild; 										
		    }
		}
				
}

void InOrderTraversal_NoRecursion(BiTNode *T)				// 中序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		// T為空指標或者棧為空時終止。棧中不壓入空指標。
		{
		    while(T)						// 一直向左並將沿途結點壓入堆疊
		    {   
		        Stack[++top]=T; 
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				T=Stack[top--]; 									// 結點彈出堆疊
				printf("%c ",T->data); 								//(訪問)列印結點
				T=T->rchild; 										// 轉向右子樹
		    }
		}
				
}

void PostOrderTraversal_NoRecursion(BiTNode *T)				// 後序遍歷非遞迴遍歷演算法
{   
		BiTNode	 *Stack[MAXSIZE];
		int Stack1[MAXSIZE];
		int	 top=-1;int tag;				
		while(T || (top!=-1))		
		{
		    while(T)						
		    {   
		        Stack[++top]=T;
				tag=0;
				Stack1[top]=tag;
		        T=T->lchild; 
		    }	
			if(Stack1[top]==0)
			{
				tag=1;
				Stack1[top]=tag;
				T=Stack[top]->rchild;
			}
			else
			{
				T=Stack[top];
				top--;
				printf("%c ",T->data);
				T=NULL; 	
			}	    
		   
		}
				
}

void LevelorderTraverse(BiTNode *T)
{  
	BiTNode *Queue[MAXSIZE];
	int front=0,rear=0;
	if(T) 
	{ 
		Queue[++rear]=T;    							/*   根結點入隊  */
		while(front<rear)
	    {  
			T=Queue[++front];  
			printf("%c ",T->data);
	        if(T->lchild!=NULL)
	            Queue[++rear]=T->lchild;   			 /*   左結點入隊  */
	        if(T->rchild!=NULL)
	            Queue[++rear]=T->rchild;   			 /*   右結點入隊  */
	    }
	      
	}
}


void find_address(BiTree &T) //"ABD  EHJ  KL  M N   CF  G I  " 
{
	if(T) 						
	{
		if(T->data==m)
		{
			if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子");
			else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c ",T->rchild->data);
			else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c  沒有右孩子",T->lchild->data);
			else 
			{
				printf("左孩子 %c ",T->lchild->data);
				printf("右孩子 %c ",T->rchild->data);
			}
			printf("   查詢節點所在層次%d \n",level); 
		}	
		level++;				
    	find_address(T->lchild);				 	
    	find_address(T->rchild);
		level--; 	
   	}
}						
 
void PreOrdershow(BiTree T)						// 先序遍歷廣義表輸出 
{ 
	if(T)
	{	 
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
			return;
		}
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf("%c(",T->data); 
		}
		
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
		}
		PreOrdershow(T->lchild); 
		if(T->rchild!=NULL)
		{
			printf(",");
		}
		PreOrdershow(T->rchild);
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf(")");
		}		
		
		
					
	}
}

int max(int a, int b)
{
	return a>=b ? a:b;
}

int	BTree_Height(BiTree T)											//高度 
{
	if(T==NULL)
		return	0;
	else
		if(T->lchild==NULL && T->rchild==NULL)
			return	1;
		else
			return	1+max(BTree_Height(T->lchild),BTree_Height(T->rchild));
}

void PreOrderPrintLeaves(BiTree T)			// 輸出葉子結點值
{
    if(T) 
    {
        if(T->lchild==NULL && T->rchild==NULL)
    		printf("%c ",T->data );
        PreOrderPrintLeaves (T->lchild);
        PreOrderPrintLeaves (T->rchild);
    }
}


int	main()
{
	BiTree	root; 
	printf("建立二叉樹\n");
	InitBiTree(root);
	CreateBiTree(root);
	printf("\n");

	printf("輸出二叉樹\n");//"ABD  EHJ  KL  M N   CF  G I  " 
	PreOrdershow(root);
	printf("\n\n");

	printf("查詢定位\n");
	m='G';
	find_address(root);	
	printf("\n\n");

	
	printf("釋放二叉樹\n");
	DestroyBiTree(root);	
	printf("\n");		
}
#include<stdio.h>
#include<stdlib.h>

#define OK 			1
#define ERROR 		0
#define MAXSIZE 	50
#define OVERFLOW	-1

typedef int Status; 
typedef char TElemType;
char m;
typedef struct BiTNode
{
	TElemType		data;
	struct BiTNode	*lchild, *rchild; 				
} BiTNode, *BiTree;

Status InitBiTree(BiTree &T)						//構造空二叉樹T
{ 
	T=NULL;
	return OK;
}

void DestroyBiTree(BiTree &T)						//後序銷燬二叉樹T
{ 
	if(T) 		
	{
    	if(T->lchild) DestroyBiTree(T->lchild); 	
     	if(T->rchild) DestroyBiTree(T->rchild); 	
     	free(T); 										
     	T=NULL; 											
   	}
}

void CreateBiTree(BiTree &T)						//先序建立二叉樹 
{ 
   	TElemType	ch;
   	scanf("%c",&ch);
   	if(ch==' ') T=NULL;
   	else
	{
    	T=(BiTNode *)malloc(sizeof(BiTNode));
     	if(!T) exit(OVERFLOW);
    	T->data=ch; 										
    	CreateBiTree(T->lchild); 					
     	CreateBiTree(T->rchild); 					
  	}
}

void PreOrderTraverse(BiTree T)						// 先序遍歷遞迴 
{ 
	if(T)
	{
	   	printf("%c ",T->data); 							
     	PreOrderTraverse(T->lchild);				 	
     	PreOrderTraverse(T->rchild); 			
   	}
}

void InOrderTraverse(BiTree T)						// 中序遍歷遞迴 
{
   	if(T)					
   	{
    	 InOrderTraverse(T->lchild);  		
    	 printf("%c ",T->data); 					
    	 InOrderTraverse(T->rchild);  			
   	}
}

void PostOrderTraverse(BiTree T)					// 後序遍歷遞迴 
{
	if(T) 		
	{
     	PostOrderTraverse(T->lchild); 	
    	PostOrderTraverse(T->rchild); 		
     	printf("%c ",T->data);  				
   	}
}


// 中序遍歷非遞迴遍歷演算法
void InOrderTraversal_NoRecursion( BiTNode *T )
{   
		BiTNode	 *Stack[MAXSIZE];
		int	 top=-1;				
		while(T || (top!=-1))		// T為空指標或者棧為空時終止。棧中不壓入空指標。
		{
		    while(T)						// 一直向左並將沿途結點壓入堆疊
		    {   
		        Stack[++top] = T; 
		        T=T->lchild; 
		    }		    
		    if(top!=-1)
		    {
				    T=Stack[top--]; 									// 結點彈出堆疊
				    printf("%c ",T->data); 						//(訪問)列印結點
				    T=T->rchild; 											// 轉向右子樹
		    }
		}
				
}

void find(BiTree T)
{
	if(T)
	{
		if(T->data==m)
		{
			if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n");
			else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data);
			else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c  沒有右孩子\n",T->lchild->data);
			else 
			{
				printf("左孩子 %c ",T->lchild->data);
				printf("右孩子 %c \n",T->rchild->data);
			}
		}						
     	find(T->lchild);				 	
     	find(T->rchild); 			
   	}
}						
 
void PreOrdershow(BiTree T)						// 先序遍歷廣義表輸出 
{ 
	if(T) 						
	{	 
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
			return;
		}
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
			printf("%c(",T->data); 
		}
		
		if(T->lchild==NULL && T->rchild==NULL)
		{
			printf("%c",T->data);
		}
		PreOrdershow(T->lchild); 
		if(T->rchild!=NULL)
		{
			printf(",");
		}
		PreOrdershow(T->rchild);
		if(T->lchild!=NULL || T->rchild!=NULL)
		{
				printf(")");
		}		
		
		
					
   	}
}
int max(int a, int b)
{
	return a>=b ? a : b;
}

int	BTree_Height(BiTree T)											//高度 
{
	if(T==NULL)
		return	0;
	else
		if(T->lchild==NULL && T->rchild==NULL)
			return	1;
		else
			return	1+max(BTree_Height(T->lchild),BTree_Height(T->rchild));
}

int PrintAncestors(BiTree root, char x)							//查詢x並輸逆序出x的祖先 
{
    if (!root)  return 0;
    if (root->data==x)   
	{
		
        printf("%c ",root->data);
        return 1;
	} 
    //如果子樹中可以找到匹配值 那麼此節點肯定是祖先結點
    if (PrintAncestors(root->lchild, x) || PrintAncestors(root->rchild, x))
    {
        printf("%c ", root->data);
        return 1;
    }
    return 0;
}//列印祖先

void LeavestoGra(BiTree T,TElemType path[],int len) 		//所有葉子節點到根節點的逆序列 (先序遍歷 
{   
    if(T!=NULL)
    {   
		if(T->lchild==NULL && T->rchild==NULL)    //輸出棧中所有結點
        {   
            printf("%c->",T->data);
            for(int i=len-1;i>0;i--)
                printf("%c->",path[i]);
            printf("%c\n",path[0]);
        }
        else
        {   path[len++]=T->data;
            LeavestoGra(T->lchild,path,len);
            LeavestoGra(T->rchild,path,len);
        }
    }
}

void MaxPath(BiTree T,TElemType path[],int len,TElemType maxpath[],int &maxlen)
{   
    if(T!=NULL)
    {   
		if(T->lchild==NULL && T->rchild==NULL)    //輸出棧中所有結點值
        {   
			if(len>maxlen) //通過比較求最長路徑
			{
				maxpath[len]=T->data;
				for(int i=len-1;i>=0;i--)
        		maxpath[i]=path[i];
        		maxlen=len+1;
        	}
        }
        else
        { 
			path[len++]=T->data;          //將當前節點放入路徑中   //路徑長度增1
        	MaxPath(T->lchild,path,len,maxpath,maxlen);
        	MaxPath(T->rchild,path,len,maxpath,maxlen);
        }
    }
}

void zhenghe(BiTree T,TElemType path[],int len,TElemType maxpath[],int &maxlen) 		//全部輸出與最長路徑整合 
{   
    if(T!=NULL)
    {   
		if(T->lchild==NULL && T->rchild==NULL)    //輸出棧中所有結點值
        {   
			printf("%c->",T->data);
	        for(int i=len-1;i>0;i--)
	        	printf("%c->",path[i]);
	        printf("%c\n",path[0]);
			if(len>maxlen) //通過比較求最長路徑
			{
				maxpath[len]=T->data;
				for(int i=len-1;i>=0;i--)
        		maxpath[i]=path[i];
        		maxlen=len+1;	
        	}
        	
        }
        else
        { 
			path[len++]=T->data;          //將當前節點放入路徑中   //路徑長度增1
        	zhenghe(T->lchild,path,len,maxpath,maxlen);
        	zhenghe(T->rchild,path,len,maxpath,maxlen);
        }
    }
}



void PreOrderPrintLeaves(BiTree T)			// 輸出葉子結點值
{
    if(T) 
    {
        if(T->lchild==NULL && T->rchild==NULL)
    		printf("%c ",T->data );
        PreOrderPrintLeaves (T->lchild);
        PreOrderPrintLeaves (T->rchild);
    }
}


int	main()
{
	BiTree	root; 
	printf("建立二叉樹\n");
	InitBiTree(root);
	CreateBiTree(root);
	printf("\n");
	
	printf("輸出二叉樹\n");//"ABD  EHJ  KL  M N   CF  G I  " 
	PreOrdershow(root);
	printf("\n\n");
/*
	printf("葉子結點逆序\n");
	TElemType path[MAXSIZE];
	LeavestoGra(root,path,0);
	printf("\n");
	
	printf("第一條最長逆路徑長度:");
	TElemType maxpath[MAXSIZE];int maxlen=0; 
	MaxPath(root,path,0,maxpath,maxlen);
	printf("%d\n",maxlen);
	printf("第一條最長逆路徑:");
	for(int j=maxlen;j>=0;j--)
        printf("%c ",maxpath[j]);
	printf("\n\n");
*/	
	//全部輸出與最長路徑整合 
	printf("葉子結點逆序\n");
	TElemType path[MAXSIZE];TElemType maxpath[MAXSIZE];int maxlen=0;  
	zhenghe(root,path,0,maxpath,maxlen);
	printf("\n");
	printf("第一條最長逆路徑長度:");
	printf("%d\n",maxlen);
	printf("第一條最長逆路徑:");
	for(int j=maxlen;j>=0;j--)
        printf("%c ",maxpath[j]);
	printf("\n\n");
	
	
	printf("釋放二叉樹\n");
	DestroyBiTree(root);			
}