题目:
从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。
思路:
其实还是按层遍历,用队列可以实现。关键是如何每一层打印一行。
可以重新定义一个结构:
struct Com{
Node *node;
int level;
Com(Node *_node, int _level) :node(_node), level(_level){}
};
每次往队列取出元素时,如果与当前要输出的层相同,直接输出,如果不同,则先输出换行,再输出。
每次往队列增加元素时,带上该结点所在的层。
Q.push(Com(temp.node->left, temp.level + 1));
实现如下:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Node{
int val;
Node *left;
Node *right;
Node(int _val) :val(_val), left(NULL), right(NULL){}
};
struct Com{
Node *node;
int level;
Com(Node *_node, int _level) :node(_node), level(_level){}
};
void PrintByLevel(Node *root)
{
if (!root) return;
queue<Com> Q;
Q.push(Com(root, 1));
int outLevel = 1;
while (!Q.empty())
{
Com temp = Q.front();
Q.pop();
if (temp.level == outLevel)
cout << temp.node->val << " ";
else
{
outLevel = temp.level;
cout << endl;
cout << temp.node->val << " ";
}
if (temp.node->left) Q.push(Com(temp.node->left, temp.level + 1));
if (temp.node->right) Q.push(Com(temp.node->right, temp.level + 1));
}
cout << endl;
}
int main()
{
Node *n1 = new Node(1);
Node *n2 = new Node(2);
Node *n3 = new Node(2);
Node *n4 = new Node(4);
Node *n5 = new Node(5);
Node *n6 = new Node(5);
Node *n7 = new Node(4);
Node *n8 = new Node(3);
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;
n3->left = n6;
n3->right = n7;
n7->right = n8;
PrintByLevel(n1);
return 0;
}