问题一
问题描述
从上到下按层打印二叉树,同层的从左到右打印。打印多行。
分析:可以想到层次遍历,借助队列存储结点;但是要打印成多行,所以必须设计两个变量,来表示当前打印的行的个数,和下一行打印的个数。
void PrintBinaryTree(Node* pRoot)
{
if (pRoot == NULL)
return;
queue<Node*> q;
q.push(pRoot);
int nextLevel = 0;
int curLevel = 1;
while (!q.empty())
{
Node* pCur = q.front();
printf("%d ", pCur->val);
if (pCur->left != NULL)
{
++nextLevel;
q.push(pCur->left);
}
if (pCur->right != NULL)
{
++nextLevel;
q.push(pCur->right);
}
q.pop();
--curLevel;
//一行打印完
if (curLevel == 0)
{
printf("\n");
curLevel = nextLevel;
nextLevel = 0;
}
}
}
问题二
问题描述
按之字形顺序打印二叉树,即第一行从左到右,第二行从右到左,第三行从左到右。。。。
分析
按之字形顺序打印二叉树,需要两个栈,来保存,因为每一行打印的顺序不同,奇数层存储到一个栈,偶数层存储到两一个栈中。。
打印某一行节点的时,应先把下一层的节点保存到栈中
定义两个栈 s1,s2;
打印的奇数层的话,先保存左子树,再保存右子树 到s1
打印的偶数层的话,先保存右子树,再保存左子树 到s2
void Pint(Node* pRoot)
{
if (pRoot == NULL)
return;
std::stack<Node*> s[2];
//控制访问哪个栈,
int cur = 0;
int next = 1;
s[0].push(pRoot);
while (!s[0].empty() || !s[1].empty())
{
Node* pNode = s[cur].top();
s[cur].pop();
printf("%d ", pNode->val);
if (cur == 0)
{
//打印奇数层,存储下一层,先左后右
if (pNode->left != NULL)
s[next].push(pNode->left);
if (pNode->right != NULL)
s[next].push(pNode->right);
}
else
{
//打印偶数层,存储下一层,先右后左。
if (pNode->right != NULL)
s[next].push(pNode->right);
if (pNode->left != NULL)
s[next].push(pNode->left);
}
//当前层,打印完
if (s[cur].empty())
{
printf("\n");
//感觉设计特的巧
cur = 1 - cur;
next = 1 - next;
}
}
}