vlambda博客
学习文章列表

二叉树层序遍历(队列)

首先需要一个遍历结点的指针p,初始化首尾指针,当p!=null进入循环,让根节点1入队,rear指针+1,

下面的循环遍历条件是首尾指针不等(rear!=front) 标记一下此时的父结点p就是队列的首结点p=queue[rear],首节点出队front+1,如果当前父节点的左子树不是null,那么左结点入队,rear+1

如果当前父节点的右子树不是null,那么右节点入队,rear+1.。这样一层遍历就完成了此时队列里面是2和3,p为2结点。接着第二轮,标记此时的父节点p为队列的首节点2,2结点出队front+1,

p的左子树不为null,4结点入队,同理5结点入队。第三轮。标记父节点p为队列的首节点此时为3结点。3结点出队,front+1,3结点没有左右子树进入第四轮。标记父节点p为队首4,4出队

同理下一轮5出队 。rear==front 队空结束。

#include <stdio.h>
#include
<stdlib.h>
#define MAXSIZE 256
typedef
struct BitNode{
int val;
struct BitNode * Lchild;
struct BitNode * Rchild;
}
*BitTree , TreeNode;


/*
typedef struct Queue{
int arr[MAXSIZE];
int rear ;
int front ;
} ;
*/
BitTree creatBitTree(BitTree root);
void Preorder_traversal(BitTree root);
void Level_traversal(BitTree root);
void visit(BitTree root);
int main(){
BitTree root
= NULL ;
printf(
"请输入值0表示NULL\n");
root
=creatBitTree(root);
printf(
"先序遍历是:");
Preorder_traversal(root);
printf(
"\n");
printf(
"层次遍历是:");
Level_traversal(root);
printf(
"\n");
}
BitTree creatBitTree(BitTree root){
int data ;
scanf(
"%d",&data);
if(data == 0){
root
= NULL;
}
else{
root
= (BitTree)malloc(sizeof(TreeNode));
root
->val = data;
if(!root){
printf(
"内存分配失败\n");
exit(
1);
}
root
->Lchild =creatBitTree(root->Lchild);
root
->Rchild =creatBitTree(root->Rchild);
}
return root;
}
void Preorder_traversal(BitTree root){
if(root){
printf(
"%d ",root->val);
Preorder_traversal(root
->Lchild);
Preorder_traversal(root
->Rchild);
}
}
void Level_traversal(BitTree root){
BitTree queue[MAXSIZE];
int rear =0,front =0;
BitTree p
= root ;
if(p!=NULL){
//根结点入队(是整个结点入队)
queue[rear] = p;
rear
=(rear+1)%MAXSIZE ;
while(rear != front){
//每次进来首尾指针不同的时候p指向队列中第一个元素,然后p出队,front指针+1
p =queue[front];
visit(queue[front]);
front
=(front+1)%MAXSIZE;
if(p->Lchild!=NULL){
//入队左子结点
queue[rear]=p->Lchild;
rear
=(rear+1)%MAXSIZE;
}
if(p->Rchild!=NULL){
//入队右子结点
queue[rear]=p->Rchild;
rear
=(rear+1)%MAXSIZE;

}
}
}
}
void visit(BitTree root){
printf(
"%d ",root->val);
}


二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。

 

示例:
二叉树:[3,9,20,null,null,15,7],

    3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/


/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
# define MAX_NUM
10000
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
if(!root){
*returnSize = 0;
return NULL;
}
struct TreeNode** Queen = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*MAX_NUM); // 定义指针队列,用来存储所有节点的地址
int** ret = (int**)malloc(sizeof(int*)*MAX_NUM);
int i = 0, Queen_len, level_len, level_cnt; // Queen_len:Queen中已有元素个数, level_len:每层的节点个数, level_cnt:每层的节点个数计数,
*returnColumnSizes = (int*)malloc(sizeof(int)*MAX_NUM);

// 头节点入队
Queen[0] = root;
Queen_len
++;
level_len
= 1;
*returnSize = 0;
(
*returnColumnSizes)[*returnSize] = level_len;
// 遍历队列
while(i<Queen_len){
ret[
*returnSize] = (int*)malloc(sizeof(int)*((*returnColumnSizes)[*returnSize]));
level_cnt
= 0;
// 遍历当前层
for(int j=0; j<level_len; j++){
// 取出当前节点存入ret
ret[*returnSize][j] = Queen[i+j]->val;
// 取出当前节点的左右节点存入Queen
if(Queen[i+j]->left){
Queen[Queen_len
++] = Queen[i+j]->left;
level_cnt
++;
}
if(Queen[i+j]->right){
Queen[Queen_len
++] = Queen[i+j]->right;
level_cnt
++;
}
}
i
+= level_len;
level_len
= level_cnt;
(
*returnSize)++;
(
*returnColumnSizes)[*returnSize] = level_len;
}
return ret;
}