二叉树的层次遍历
层次遍历即树的BFS
有两种方法:
1.构建两个函数PrintLevelOrder和PrintGivenLevel,前者控制层数,后者打印每层的节点
2.使用FIFO的队列
第一种方法:
#include <iostream> #include<cstdio> #include<cstdlib> using namespace std; struct node{ int data; struct node *left,*right; }; void printGivenLevel(struct node* root, int level); int height(struct node* node); struct node* newNode(int data); void printLevelOrder(struct node* root){ int h=height(root); for(int i=1;i<=h;i++) printGivenLevel(root,i); } void printGivenLevel(struct node* root,int level){ if(root==NULL) return; if(level==1) cout<<root->data; else if(level>1){ printGivenLevel(root->left,level-1); printGivenLevel(root->right,level-1); } } int height(struct node* node){ if(node==NULL) return 0; else{ int lheight=height(node->left); int rheight=height(node->right); if(lheight>rheight) return(lheight+1); else return(rheight+1); } } struct node* newNode(int data){ struct node* node=(struct node*) malloc(sizeof(struct node)); node->data=data; node->left=NULL; node->right=NULL; return(node); }; int main() { struct node* root=newNode(1); root->left=newNode(2); root->right=newNode(3); root->left->left=newNode(4); root->left->right=newNode(5); printLevelOrder(root); return 0; }
第二种方法:队列法
#include <iostream> #include<queue> using namespace std; struct Node{ int data; struct node *left,*right; }; void printLevelOrder(Node *root){ if(root==NULL) return; queue<Node *>q; q.push(root); while(q.empty()==false){ Node *node=q.front(); cout<<node->data<<" "; q.pop(); if(node->left!=NULL) q.push(node->left); if(node->right!=NULL) q.push(node->right); } } Node *newNode(int data){ Node *temp=new Node; temp->data=data; temp->data=data; temp->left=temp->right=NULL; return temp; } int main() { Node *root=newNode(1); root->left=newNode(2); root->right=newNode(3); root->left->left=newNode(4); root->left->right=newNode(5); printLevelOrder(root); return 0; }