层次遍历(广度优先遍历)二叉树
广度优先遍历在图和树中都被用来寻找最短路径,它每次会寻找一个离自己最近的结点,用队列来实现。先把根节点进队,然后每出队一个结点,它的左右结点进队,直到队为空。
层次遍历,也叫宽度优先遍历、广度优先遍历。
void levelOrder(Tree& t) {
if(t == NULL) return;
queue<TreeNode*> q;
q.push(t);
while(!q.empty()){
//出队一个结点,输出它的val
TreeNode* s = q.front();
cout<<s->val<<" ";
q.pop();
//左右孩子进队
if(s->left != NULL)
q.push(s->left);
if(s->right != NULL)
q.push(s->right);
}
}
求高度、宽度、按层输出时有必要按层来打印。
//按层输出的层次遍历
void levelOrderTraversal(Tree& t) {
if(t == NULL) return;
queue<TreeNode*> q;
q.push(t);
while(!q.empty()){
int n = q.size();
for(int i = 0;i<n;i++){
TreeNode* s = q.front();
cout<<s->val<<" ";
q.pop();
if(s->left) q.push(s->left);
if(s->right) q.push(s->right);
}
cout<<endl;//换行
}
}
完整代码如下:
#include<iostream>
#include<queue>
using namespace std;
typedef struct node{
char val;
struct node* left;
struct node* right;
}TreeNode,*Tree;
//层次遍历很简单,把先序镜像遍历二叉树的栈换成队列就可以了。
void levelOrder(Tree& t) {
if(t == NULL) return;
queue<TreeNode*> q;
q.push(t);
while(!q.empty()){
//出队一个结点,输出它的val
TreeNode* s = q.front();
cout<<s->val<<" ";
q.pop();
//左右孩子进队
if(s->left != NULL)
q.push(s->left);
if(s->right != NULL)
q.push(s->right);
}
}
//按层输出的层次遍历
void levelOrderTraversal(Tree& t) {
if(t == NULL) return;
queue<TreeNode*> q;
q.push(t);
while(!q.empty()){
int n = q.size();
for(int i = 0;i<n;i++){
TreeNode* s = q.front();
cout<<s->val<<" ";
q.pop();
if(s->left) q.push(s->left);
if(s->right) q.push(s->right);
}
cout<<endl;//换行
}
}
void CreateTree(Tree& t){
char x;
cin>>x;
if(x == '#') t = NULL;
else{
t = new TreeNode;
t->val = x;
CreateTree(t->left);
CreateTree(t->right);
}
}
int main(){
Tree t;
CreateTree(t);
/*
a b d # # e # # c f # # #
*/
cout<<endl<<"层次遍历:"<<endl;
levelOrderTraversal(t);
cout<<endl<<"层次遍历按层输出:"<<endl;
levelOrder(t);
}
运行结果: