题目:
问题一:
给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。那么分层遍历如图3-17中的二叉树,正确输出应为:
1,
2,3
4,5,6
7,8
问题二:
写另外一个函数,打印二叉树中的某层次的节点(从左到右),其中根节点为第0层,函数原型为int PrintNodeAtLevel(Node* root,int level),成功返回1,失败则返回0.
解法一:
首先我们定义节点的数据结构为(设二叉树中的数据类型为整数):
struct Node
{
int data;//节点中的数据
Node* lChild; //左子指针
Node* rChild;//右子指针
}
解决了给定层次节点的问题,那么,如果我们知道该二叉树的深度n,那么只需要调用n次PrintNodeAtLevel();
代码如下:
//层次遍历二叉树
//@param
//root ,二叉树的根节点
//depth,树的深度
void PrintNodeByLevel(Node* root, int depth)
{
for (int level = 0; level < depth; level++)
{
PrintNodeAtLevel(root, level);
cout << endl;
}
}
解法二:
解法一中,在问题1的算法中,对二叉树中每一层的访问都需要重新从根节点开始,直到访问完所有的层次。这样的做法,效率很低?更好的方法如下:
//按层次遍历二叉树
//@param
//root,二叉树的根节点
void PrintNodeByLevel(Node* root)
{
if (root == NULL)
return;
vector<Node*> vec;
vec.push_back(root);
int cur = 0;
int last = 1;
while (cur < vec.size())
{
last = vec.size();
while (cur < last)
{
cout << vec[cur]->data << " ";
if (!vec[cur]->lChild)
vec.push_back(vec[cur]->lChild);
if (!vec[cur]->rChild)
vec.push_back(vec[cur]->rChild);
cur++;
}
cout << endl;//当cur==last,说明该层访问结束,输出换行符
}
}
原文地址:http://blog.csdn.net/wangfengfan1/article/details/45566419