二叉树的层次遍历需要利用的队列的知识,按层入队。下面是代码
C的代码
#include<stdio.h>
#include<stdlib.h>
#define elemtype BiTree
#define maxsize 30
#define null 0
#define Elemtype char
typedef struct BiNode{
Elemtype data;
struct BiNode *lchild ,*rchild;
}BiNode,*BiTree;
void InitBiTree(BiTree *T){
Elemtype ch;
scanf("%c",&ch);
if(ch == '#'){ //这一点很重要,字符比较要加单引号
(*T) = null;
}else{
(*T) = (BiNode*)malloc(sizeof(BiNode));
// if(!*T){
// printf("defeat to allocation memory");
// }
(*T)->data = ch;
InitBiTree(&((*T)->lchild));
InitBiTree(&((*T)->rchild));
}
}
//队列
typedef struct{
elemtype data[maxsize];
int front , rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue *Q){
Q->front = Q->rear =0;
}
//入队
void EnQueue(SqQueue *Q,elemtype p)
{
if((Q->rear+1)%maxsize == Q->front){
printf("this Queue is full");
}else{
Q->data[Q->rear] = p;
Q->rear = (Q->rear+1)%maxsize;
}
}
//出队
void DeQueue(SqQueue *Q , elemtype *p){
if(Q->front == Q->rear){
printf("this queue is bull");
}else{
*p = Q->data[Q->front];
Q->front = (Q->front+1)%maxsize;
}
}
int emptyQueue(SqQueue Q){
if(Q.front == Q.rear){
return 1;
}
else{
return 0;
}
}
//定义visit函数
void visit (BiNode *T){
printf("%c",T->data);
}
void LevelOrder(BiTree T){
SqQueue Q;
InitQueue(&Q);
BiTree p;
EnQueue(&Q,T);
while(!emptyQueue(Q)){
DeQueue(&Q,&p);
visit(p);
if(p->lchild!=null){
EnQueue(&Q,p->lchild);
}
if(p->rchild!=null){
EnQueue(&Q,p->rchild);
}
}
}
int main()
{
BiTree T;
InitBiTree(&T);
LevelOrder(T);
}
// ABD###CE##F##
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
vector<int> res;
queue<TreeNode*> myque;
if(root == nullptr){
return res;
}else{
myque.push(root);
}
while( !myque.empty() ){
root = myque.front();
res.push_back(root->val);
myque.pop();
if(root->left != nullptr){
myque.push(root->left);
}
if(root->right != nullptr){
myque.push(root->right);
}
}
return res;
}
};