1. 程式人生 > >二叉樹遍歷(先序遍歷,中序遍歷,後序遍歷)

二叉樹遍歷(先序遍歷,中序遍歷,後序遍歷)

資料結構學習筆記

一.先序遍歷

先序遍歷二叉樹遞迴定義
if(二叉樹為空)
遍歷結束;
else
訪問根節點,先序遍歷根的左子樹,先序遍歷根的右子樹
基於二叉連結串列
------

typedef struct BiNode *BiTree;            //節點指標型別
status PreOrderTraverse(BiNode T,status(*visit)(TElemType &e))
{						               //先序遍歷二叉樹
	if(T)
	{
		visit(T->Data);			       //訪問節點
		PreorderTraverse(T->lchild,visit);//遍歷左子樹
		PreorderTraverse(T->rchild,visit);//遍歷右子樹
	}
}

二.中序遍歷

先序遍歷二叉樹遞迴定義
if(二叉樹為空)
遍歷結束;
else
訪問根的左子樹,訪問中序根節點,中序遍歷根的右子樹

typedef struct BiNode *BiTree;            //節點指標型別
void InOrderTraverse(BiTree T)
{						               //先序遍歷二叉樹
	if(T)
	{
		InOrderTraverse(T->lchild);	      //遞迴訪問左子樹
		printf("%c",T->data);           //遞迴結點
		InOrderTraverse(T->rchild);     //遞迴訪問右子樹	
	}
	return;
}

三.後序遍歷

先序遍歷二叉樹遞迴定義
if(二叉樹為空)
遍歷結束;
else
後遍歷根的左子樹,後序遍歷根的右子樹,訪問根節點

typedef struct BiNode *BiTree;            //節點指標型別
void PostOrderTraverse(BiTree T)
{						               //先序遍歷二叉樹
	if(T)
	{
		PostOrderTraverse(T->lchild);	     //遞迴訪問左子樹
		PostOrderTraverse(T->rchild);        //遞迴訪問右子樹	
		printf("%c",T->data);                //遞迴結點
	}
	return;
}

說明:
三種遍歷方式訪問節點順序相同,從根節點出發再回 到根節點
不同的是訪問時機, 先序遍歷首次遇到該節點便訪問,中序是第二次遇到訪問
後序是第三次遇到同一節點再訪問