题目一:不分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。二叉树节点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
void PrintFromTopToBottom(BinaryTreeNode* pTreeRoot)
{
if(!pTreeRoot)
return;
std::deque<BinaryTreeNode*> dequeTreeNode;
dequeTreeNode.push_back(pTreeRoot);
while(dequeTreeNode.size())
{
BinaryTreeNode *pNode=dequeTreeNode.front();
dequeTreeNode.pop_front();
printf("%d",pNode->m_nValue);
if(pNode->m_pLeft)
dequeTreeNode.push_back(pNode->m_pLeft);
if(pNode->m_pRight)
dequeTreeNode.push_back(pNode->m_pRight);
}
}
题目二:分行从上到下打印二叉树
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
void Print(BinaryTreeNode* pRoot)
{
if(pRoot==nullptr)
return;
std::queue<BinaryTreeNode*> nodes;
nodes.push(pRoot);
int nextLevel=0;
int toBePrinted=1;
while(!nodes.empty())
{
BinaryTreeNode* pNode=nodes.front();
printf("%d",pNode->m_nValue);
if(pNode->m_pLeft!=nullptr)
{
nodes.push(pNode->m_pLeft);
++nextLevel;
}
if(pNode->m_pRight!=nullptr)
{
nodes.push(pNode->m_pRight);
++nextLevel;
}
nodes.pop();
--toBePrinted;
if(toBePrinted==0)
{
printf("\n");
toBePrinted=nextLevel;
nextLevel=0;
}
}
}
题目三:之字形打印二叉树
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
按之字形顺序打印二叉树需要两个栈。我们在打印某一层的节点时,把下一层的子节点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子节点再保存右子节点到第一个栈里;如果当前打印的是偶数层,则先保存右子节点再保存左子节点到第二个栈里。
void Print(BinaryTreeNode* pRoot)
{
if(pRoot==nullptr)
return;
std::stack<BinaryTreeNode*> levels[2];
int current=0;
int next=1;
levels[current].push(pRoot);
while(!levels[0].empty()||!levels[1].empty())
{
BinaryTreeNode* pNode=levels[current].top();
levels[current].pop();
printf("%d",pNode->m_nValue);
if(current==0)
{
if(pNode->m_pLeft!=nullptr)
levels[next].push(pNode->m_pLeft);
if(pNode->m_pRight!=nullptr)
levels[next].push(pNode->m_pRight);
}
else
{
if(pNode->m_pRight!=nullptr)
levels[next].push(pNode->m_pRight);
if(pNode->m_pLeft!=nullptr)
levels[next].push(pNode->m_pLeft);
}
if(levels[current].empty())
{
printf("\n");
current=1-current;
next=1-next;
}
}
}