1. 程式人生 > >郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示

郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示

郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示

 

知道遞迴的實現與應用,二叉樹的遍歷就容易了。

 

程式碼如下:

#include <stdio.h>
#include <malloc.h>

struct BTNode
{
	char data;
	struct BTNode *pLchild;	//p是指標 L是左 child是孩子 
	struct BTNode *pRchild;
};

struct BTNode *CreateBTree(void);
void PreTraverseBTree(struct BTNode *pT);
void InTraverseBTree(struct BTNode *pT); 
void PostTraverseBTree(struct BTNode *pT);

int main(void)
{
	//原始二叉樹: 
	//    A
	// B      C
	//      D 
	//        E        
	//
	struct BTNode *pT = CreateBTree();//返回根節點地址
	
	//線性輸出 
	//先序 
	//PreTraverseBTree(pT);//ABCDE
	//中序
	//InTraverseBTree(pT);//BADEC
	//後序
	PostTraverseBTree(pT);//BEDCA
	
	return 0;
}

//後序遍歷 
void PostTraverseBTree(struct BTNode *pT)
{
	//用根節點pT代表整一棵樹 
	//用pT->pLchild可以代表整個左子樹 
	if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 
	{
		//先先序訪問左子樹
		if (NULL != pT->pLchild)
		{
			PostTraverseBTree(pT->pLchild);
		}
		//再先序訪問右子樹
		if (NULL != pT->pRchild)
		{
			PostTraverseBTree(pT->pRchild);
		}
		//再先訪問根節點
		printf("%c\n", pT->data);//pT就是根 
	}
}

//中序遍歷 
void InTraverseBTree(struct BTNode *pT)
{
	//用根節點pT代表整一棵樹 
	//用pT->pLchild可以代表整個左子樹 
	if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 
	{
		//先先序訪問左子樹
		if (NULL != pT->pLchild)
		{
			InTraverseBTree(pT->pLchild);
		}
		//再先訪問根節點
		printf("%c\n", pT->data);//pT就是根 
		
		//再先序訪問右子樹
		if (NULL != pT->pRchild)
		{
			InTraverseBTree(pT->pRchild);
		}
	}
}

//先序遍歷 
void PreTraverseBTree(struct BTNode *pT)
{
	//用根節點pT代表整一棵樹 
	//用pT->pLchild可以代表整個左子樹 
	if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 
	{
		//先訪問根節點
		printf("%c\n", pT->data);//pT就是根 
		//再先序訪問左子樹
		if (NULL != pT->pLchild)
		{
			PreTraverseBTree(pT->pLchild);//訪問左子樹 
		}
		//再先序訪問右子樹
		if (NULL != pT->pRchild)
		{
			PreTraverseBTree(pT->pRchild);//訪問右子樹 
		}
	}
}

struct BTNode *CreateBTree(void)
{
	//靜態樹,規定好的 
	
	struct BTNode *pA = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode *pB = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode *pC = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode *pD = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode *pE = (struct BTNode *)malloc(sizeof(struct BTNode));

	pA->data = 'A';
	pB->data = 'B';
	pC->data = 'C';
	pD->data = 'D';
	pE->data = 'E';
	
	pA->pLchild = pB;
	pA->pRchild = pC;
	pB->pLchild = pB->pRchild = NULL;
	pC->pLchild = pD;
	pC->pRchild = NULL;
	pD->pLchild = NULL;
	pD->pRchild = pE;
	pE->pLchild = pE->pRchild = NULL;
	
	return pA;//返回根節點地址 
}