二叉樹遍歷的遞歸和非遞歸算法

二叉樹的遍歷(包括先序遍歷,中序遍歷,後續遍歷,層序遍歷)也是在面試和筆試中常遇到的問題。

下面給出二叉樹幾種遍歷方法的遞歸和非遞歸的寫法。程序只是想着寫出來了,但是沒有用用例檢驗,不知道是否有出錯。

哎!!!還是太懶了!!!歡迎不吝賜教!!!!




typedef struct BiTNode
{
    int m_nData;
	struct BiTNode *m_pLchild,*m_pRchild;
}BiTNode,*BiTree;

//二叉樹先序遍歷的遞歸算法
void PreOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	visite(T->m_nData);
	PreOrderTraverse(T->m_pLchild);
	PreOrderTraverse(T->m_pRchild);
}

//二叉樹先序遍歷的非遞歸算法
void PreOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	BiTree p = T;
	stack<BiTree> pStack;
	while(p!=NULL || !pStack.empty())
	{
		while(p!=NULL)
		{
			visite(p->m_nData);
			pStack.push(p);
			p = p->m_pLchild;
		}
		if(!pStack.empty())
		{
			pStack.pop();
			p = p->m_pRchild;
		}
	}
}

//二叉樹中序遍歷的遞歸算法
void InOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	InOrderTraverse(T->m_pLchild);
	visite(T->m_nData);
	InOrderTraverse(T->m_pRchild);
}

// 二叉樹中序遍歷的非遞歸算法
void InOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	BiTree p = T;
	stack<BiTree> pStack;
	while(p!=NULL || !pStack.empty())
	{
		while(p!=NULL)
		{
			pStack.push(p);
			p = p->m_pLchild;
		}
		if(!pStack.empty())
		{
			p = pStack.top();
			visite(p->m_nData);
			pStack.pop();
			p = p->m_pRchild;
		}
	}
}

//二叉樹後續遍歷的遞歸算法
void PostOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	PostOrderTraverse(T->m_pLchild);
	PostOrderTraverse(T->m_pRchild);
	visite(T->m_nData);
}

//二叉樹後續遍歷的非遞歸算法(有點麻煩,有時間再寫了)
void PostOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	BiTree p = T;
	stack<BiTree> pStack;
	while(p!=NULL ||)
}

//層序遍歷
void LevelTraverse(BiTree T)
{
	if(T==NULL)
		return;
	BiTree p = T;
	deque<BiTree> dequeTreeNode;
	dequeTreeNode.push_back(p);
	while(dequeTreeNode.size())
	{
		BiTree pNode = dequeTreeNode.front();
		dequeTreeNode.pop_front();
		visite(pNode->m_nData);
		if(pNode->m_pLchild)
			dequeTreeNode.push_back(pNode->m_pLchild);
		if(pNode->m_pRchild)
			dequeTreeNode.push_back(pNode->m_pRchild);
	}
}


發佈了41 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章