面試題23:從上往下打印二叉樹
1.題目描述:
從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序打印。例如輸入下圖中的二叉樹,則依次打印出8、6、10、5、7、9、11。
叉樹結點的定義如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
2.題目分析
因爲按層打印的順序決定應該先打印根結點,所以我們從樹的根結點開始分析。爲了接下來能夠打印值爲8的結點的兩個子結點,我們應該在遍歷到該結點時把值爲6和10的兩個結點保存到一個容器裏,現在容器內就有兩個結點了。按照從左到右打印的要求,我們先取出值爲6的結點。打印出值6之後把它的值分別爲5和7的兩個結點放入數據容器。此時數據容器中有三個結點,值分別爲10、5和7。接下來我們從數據容器中取出值爲10的結點。注意到值爲10的結點比值爲5、7的結點先放入容器,此時又比這兩個結點先取出,這就是我們通常說的先入先出,因此不難看出這個數據容器應該是一個隊列。由於值爲5、7、9、11的結點都沒有子結點,因此只要依次打印即可。整個打印過程如下表所示。
通過上面具體例子的分析,我們可以找到從上到下打印二叉樹的規律:每一次打印一個結點的時候,如果該結點有子結點,則把該結點的子結點放到一個隊列的末尾。接下來到隊列的頭部取出最早進入隊列的結點,重複前面的打印操作,直至隊列中所有的結點都被打印出來爲止。
3.code
void PrintFromTopToBottom(BinaryTreeNode* pTreeRoot)
{
if(!pTreeRoot)//if(pTreeRoot == NULL)
{
return ;
}
std::deque<BinaryTreeNode*> dequeTreeNode;
dequeTreeNode.push_back(pTreeRoot);
while(!dequeTreeNode.empty())
{
BinaryTreeNode* pNode = dequeTreeNode.front();
dequeTreeNode.pop_front();
std::cout<<pNode->m_nValue<<" ";
if(pNode->m_pLeft)
{
dequeTreeNode.push_back(pNode->m_pLeft);
}
if(pNode->m_pRight)
{
dequeTreeNode.push_back(pNode->m_pRight);
}
}
}