天天看點

二叉樹周遊的遞歸和非遞歸算法

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

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

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

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);
	}
}
           

繼續閱讀