码迷,mamicode.com
首页 > 其他好文 > 详细

分层遍历二叉树

时间:2015-05-08 09:43:16      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:遍历   数组   二叉树   

题目:

问题一:

     给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。那么分层遍历如图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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!