分层遍历二叉树,每层输出为一行
2011-08-16 09:29
363 查看
如果只是分层遍历二叉树并打印出所有元素,那么使用队列来实现BFS是最好的选择。
但是这里要求,每层元素打印为一行,所以我们必须知道每层元素的开始和结束是什么,这种情况下,使用数组或者vector容器是更好的选择,使用两个变量来标识每一层的开始和结束,控制每一层元素的访问。代码如下:
如果要求自叶子节点到根,分层打印出每层节点呢?
此时上面的方法将不适用,因为上面的方法,在遍历的同时,vector也在自适应地往后生长,符合自根向叶子遍历的方向。
可以在每一层之间加一个标识来解决这个问题,比如使用NULL来分隔每一层。同时左右孩子节点加入vector的顺序决定了遍历的时候是从左往右还是从右往左。
但是这里要求,每层元素打印为一行,所以我们必须知道每层元素的开始和结束是什么,这种情况下,使用数组或者vector容器是更好的选择,使用两个变量来标识每一层的开始和结束,控制每一层元素的访问。代码如下:
/* * 分层打印二叉树,每层一行 * */ #include <iostream> #include <queue> using namespace std; struct Node { int data; Node *left; Node *right; }; vector<Node *> vec; //如果是普通的分层遍历二叉树,只要求把序列打印出来 //用队列是最好的选择 //但是这里要每一层分行打印,就需要增加标识一层开始 //和结束的标志了,因此用vector或数组比较合适 void TravelByLevel(Node *root) { if(root == NULL) return; vec.push_back(root); int cur = 0; int last = 1; while(cur < vec.size()){ last = vec.size(); //一层的开始 while(cur < last){ cout << vec[cur] << " "; if(vec[cur]->left != NULL){ vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL){ vec.push_back(vec[cur]->right); } cur++; } cout << endl; } }
如果要求自叶子节点到根,分层打印出每层节点呢?
此时上面的方法将不适用,因为上面的方法,在遍历的同时,vector也在自适应地往后生长,符合自根向叶子遍历的方向。
可以在每一层之间加一个标识来解决这个问题,比如使用NULL来分隔每一层。同时左右孩子节点加入vector的顺序决定了遍历的时候是从左往右还是从右往左。
/* * 自底向上分层访问二叉树节点 * */ #include <iostream> using namespace std; struct Node { int data; Node *left; Node *right; }; vector<Node *> vec; //direction控制节点访问的顺序是从左向右还是从右向左 void PrintNodeByLevel(Node *root, int direction) { if(root == NULL) return; vec.push_back(root); int cur = 0; int last; while(cur < vec.size()){ last = vec.size(); vec.push_back(NULL); while(cur < last){ //每层访问的顺序从右向左 if(direction){ if(vec[cur]->left != NULL){ vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL){ vec.push_back(vec[cur]->right); } //每层访问的顺序从左向右 }else{ if(vec[cur]->right != NULL){ vec.push_back(vec[cur]->right); } if(vec[cur]->left != NULL){ vec.push_back(vec[cur]->left); } } cur++; } //跳过NULL cur++; } //反向遍历,输出结果 for(vector<Node *>::iterator iter = vec.rbegin(); iter != vec.rend(); ++iter){ if(*iter == NULL){ cout << endl; }else{ cout << (*iter)->data << " "; } } }
相关文章推荐
- 分层遍历二叉树,每层输出为一行
- 二叉树先序遍历中序遍历结果得出该树,并以后序遍历形式输出
- LeetCode 102. Binary Tree Level Order Traversal(二叉树分层遍历)
- 二叉树的层次遍历+每一层单行输出
- 3.10 分层遍历二叉树
- 【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。
- java算法(一)二叉树逐层遍历打印(分层换行)
- 二叉树的分层遍历
- 分层遍历二叉树
- 编程之美读书笔记_3.8 求二叉树中节点的最大距离 和 3.10分层遍历二叉树 相关代码
- 《编程之美》:分层遍历二叉树
- 已知二叉树先序遍历,中序遍历创建二叉树并输出后序遍历
- 102. Binary Tree Level Order Traversal (二叉树层次遍历 输出每层)
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历的结果,输出后序遍历结果。
- 查找树(二叉树)的构建以及分层遍历
- 从上往下打印二叉树(分层遍历)
- 构造二叉树的抽象数据类型对于给定的先序序列和中序序列,构造二叉树,并按层输出所有结点内容,要求每层结点输出一行按层输出上述二叉树所表示的森林的所有结点内容
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 编程之美读书笔记-分层遍历二叉树
- 分层遍历二叉树