二叉樹的周遊(包括先序周遊,中序周遊,後續周遊,層序周遊)也是在面試和筆試中常遇到的問題。
下面給出二叉樹幾種周遊方法的遞歸和非遞歸的寫法。程式隻是想着寫出來了,但是沒有用用例檢驗,不知道是否有出錯。
哎!!!還是太懶了!!!歡迎不吝賜教!!!!
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);
}
}