参考博客:http://www.cnblogs.com/miloyip/archive/2010/05/12/binary_tree_traversal.html
题目:
(编程之美 3.10)给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉数(每一层输出一行),每一层访问的顺序必须从左到右。
解答:
两种解法
- 将树每一层节点保存到数组中,数组中使用begin和end两个游标来标识[begin, end)之间的节点是一层的,遍历每一层的节点,将该层节点的子节点从左到右加入数组中,直到所有节点都输出
- 使用deque队列,基本思想同1,改进的地方在于,不使用游标来标识每一层,而是在每一层的结束插入一个空指针,同时将已经处理过的节点移除队列。2使用的空间比1少。
注意:
- 也可以使用两个队列,一个队列保存本层的节点,另一个保存下层的节点
代码:
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
struct Node
{
Node *left;
Node *right;
int value;
};
//use vector
void outputTreeByLevel(Node *root)
{
if(root == 0)
return;
vector<Node *> vec;
int begin, end;
begin = 0;
end = 0;
vec.push_back(root);
while(end < vec.size())
{
end = vec.size();
while(begin < end)
{
cout << vec[begin]->value << " ";
if(vec[begin]->left)
vec.push_back(vec[begin]->left);
if(vec[begin]->right)
vec.push_back(vec[begin]->right);
begin++;
}
cout << endl;
}
}
//use deque
void printBinaryTreeByLevel(Node *root)
{
if(root == 0)
return;
deque<Node *> de;
de.push_back(root);
de.push_back(0);
do
{
Node *temp = de.front();
de.pop_front();
if(temp == 0)
{
cout << endl;
if(de.size() != 0)
de.push_back(0);
}
else
{
cout << temp->value << " ";
if(temp->left)
de.push_back(temp->left);
if(temp->right)
de.push_back(temp->right);
}
}while(!de.empty());
}
//test
void link(Node *nodes, int parent, int left, int right)
{
if(left != -1)
nodes[parent].left = &nodes[left];
if(right != -1)
nodes[parent].right = &nodes[right];
}
int main()
{
Node test[9] = {0};
for(int i = 0; i < 9; i++)
test[i].value = i;
link(test, 0, 1, 2);
link(test, 1, 3, 4);
link(test, 2, 5, 6);
link(test, 3, 7, 8);
outputTreeByLevel(&test[0]);
printBinaryTreeByLevel(&test[0]);
return 0;
}