32.1不分行从上到下打印二叉树
用个队列就可以
32.2分行打印二叉树
用队列遍历二叉树,用一个变量记录当前层的节点数,用另一个变量记录下一层节点数
32.3之字形打印二叉树
用两个栈来实现,一个栈记录当前遍历层,另一个栈记录下一个遍历层
任意一个栈按照左->右子树方向压栈,每取出一个父节点,其子节点按照右->左子树压到另一个栈,循环往复,就能实现之字形,动手画一画
32.2
void Print(BinaryTreeNode* pRoot)//diy
{
if (pRoot == nullptr) return;
int curLayNum = 0, nextLayNum = 0;
std::queue<BinaryTreeNode*> Que;
Que.push(pRoot);
curLayNum++;
while (curLayNum != 0)
{
while (curLayNum != 0)
{
BinaryTreeNode* pTemp = Que.front();
Que.pop();
curLayNum--;
printf("%d,", pTemp->m_nValue);
if (pTemp->m_pLeft != nullptr)
{
Que.push(pTemp->m_pLeft);
nextLayNum++;
}
if (pTemp->m_pRight != nullptr)
{
Que.push(pTemp->m_pRight);
nextLayNum++;
}
}
printf("\n");
curLayNum = nextLayNum;
nextLayNum = 0;
}
}
32.3
void Print(BinaryTreeNode* pRoot)//diy,如果把stack1和2用数组代码整合应该会简洁一些
{
while (pRoot == nullptr) return;
std::stack<BinaryTreeNode*> stack1;
std::stack<BinaryTreeNode*> stack2;
bool LeftToRight = true;//r to l
stack1.push(pRoot);
while (stack1.size()>0 || stack2.size()>0)
{
while (stack1.size()>0)
{
BinaryTreeNode* pTemp = stack1.top();
printf("%d ", pTemp->m_nValue);
stack1.pop();
if (LeftToRight)
{
if (pTemp->m_pLeft != nullptr)
stack2.push(pTemp->m_pLeft);
if (pTemp->m_pRight != nullptr)
stack2.push(pTemp->m_pRight);
}
else
{
if (pTemp->m_pRight != nullptr)
stack2.push(pTemp->m_pRight);
if (pTemp->m_pLeft != nullptr)
stack2.push(pTemp->m_pLeft);
}
}
printf("\n");
LeftToRight = !LeftToRight;
while (stack2.size() > 0)
{
BinaryTreeNode* pTemp = stack2.top();
printf("%d ", pTemp->m_nValue);
stack2.pop();
if (LeftToRight)
{
if (pTemp->m_pLeft != nullptr)
stack1.push(pTemp->m_pLeft);
if (pTemp->m_pRight != nullptr)
stack1.push(pTemp->m_pRight);
}
else
{
if (pTemp->m_pRight != nullptr)
stack1.push(pTemp->m_pRight);
if (pTemp->m_pLeft != nullptr)
stack1.push(pTemp->m_pLeft);
}
}
printf("\n");
LeftToRight = !LeftToRight;
}
return;
}