数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html

对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现。这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的习惯,还是按照课本上来所有函数都是有返回值的,对于想要返回值的函数直接使用地址传递。

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #define TRUE 1
  4 #define FALSE 0
  5 #define MAX 20
  6 typedef struct BTNode        /*节点结构声明*/
  7 {
  8     char data ;               /*节点数据*/
  9     struct BTNode *lchild;
 10     struct BTNode *rchild ;  /*指针*/
 11 }*BiTree;
 12 typedef struct Node///队列中结点结构
 13 {
 14     BiTree data;///数据域(二叉树结构体)
 15     struct Node *next;///指针域
 16 } LinkQNode;
 17 typedef struct///队列结构
 18 {
 19     LinkQNode *front;///队头指针
 20     LinkQNode *rear;///队尾指针
 21 } LinkQueue;
 22 void InitLinkQueue(LinkQueue *Q)///初始化列队列
 23 {
 24     Q->front=(LinkQNode *)malloc(sizeof(LinkQNode));
 25     Q->rear=Q->front;///队头指针和队尾指针都指向头结点
 26     Q->front->next=NULL;
 27 }
 28 int IsLQEmpty(LinkQueue *Q)///判断队列是否为空
 29 {
 30     if(Q->front==Q->rear)
 31     {
 32         return TRUE;
 33     }
 34     else
 35     {
 36         return FALSE;
 37     }
 38 }
 39 int EnLinkQueue(LinkQueue *Q,BiTree x)
 40 {
 41     LinkQNode *NewNode;
 42     NewNode=(LinkQNode *)malloc(sizeof(LinkQNode));///开辟新结点
 43     if(NewNode!=NULL)
 44     {
 45         NewNode->data=x;
 46         NewNode->next=NULL;
 47         Q->rear->next=NewNode;///在队尾插入结点
 48         Q->rear=NewNode;///修改队尾指针
 49         return TRUE;
 50     }
 51     else///溢出
 52     {
 53         return FALSE;
 54     }
 55 }
 56 int DeLinkQueue(LinkQueue *Q,BiTree *x)///删除对头指针,并用x返回删除的值
 57 {
 58     LinkQNode *p;
 59     if(Q->front==Q->rear)
 60     {
 61         return FALSE;
 62     }
 63     p=Q->front->next;///p指向对头元素
 64     Q->front->next=p->next;///对头元素p出队
 65     if(Q->rear==p)///如果队列中只有一个元素p,则p出队后变成空队
 66     {
 67         Q->rear=Q->front;
 68     }
 69     *x=p->data;
 70     free(p);
 71     return TRUE;
 72 }
 73 int GetLQHead(LinkQueue *Q,BiTree *x)///获取队头元素,用x返回其值
 74 {
 75     LinkQNode *p;///中间变量
 76     if(Q->front==Q->rear)
 77     {
 78         return FALSE;
 79     }
 80     p=Q->front->next;
 81     *x=p->data;
 82     free(p);
 83     return 1;
 84 }
 85 BiTree createBiTree(BiTree t)  /* 先序遍历创建二叉树*/
 86 {
 87     char s;
 88     printf("\nplease input data:(exit for #)");
 89     s=getchar();
 90     if(s==‘#‘)
 91     {
 92         t=NULL;
 93         return t;
 94     }
 95     t=(BiTree)malloc(sizeof(struct BTNode));
 96     if(t==NULL)
 97     {
 98         printf("Memory alloc failure!");
 99         exit(0);
100     }
101     t->data=s;
102     t->lchild=createBiTree(t->lchild); /*递归建立左子树*/
103     t->rchild=createBiTree(t->rchild); /*递归建立右子树*/
104     return t;
105 }
106
107 void LevelOrder(BiTree p)
108 {
109     LinkQueue *Q;
110     Q=(LinkQueue *)malloc(sizeof(LinkQueue));
111     InitLinkQueue(Q);
112     EnLinkQueue(Q,p);
113     while(!IsLQEmpty(Q))
114     {
115         DeLinkQueue(Q,&p);///出队列并取队头元素
116         printf("%c",p->data);//左右孩子入队
117         if(p->lchild!=NULL)
118         {
119             EnLinkQueue(Q,p->lchild);
120         }
121         if(p->rchild!=NULL)
122         {
123             EnLinkQueue(Q,p->rchild);
124         }
125     }
126     printf("\n");
127 }
128 int main()
129 {
130     BiTree t=NULL;
131     t=createBiTree(t);
132     printf("\n\n层次遍历序列:");
133     LevelOrder(t);
134     release(t);
135     return 0;
136 }

原文地址:https://www.cnblogs.com/wkfvawl/p/9975649.html

时间: 2024-10-22 03:24:48

数据结构——链队列实现二叉树的层次遍历的相关文章

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

数据结构实验之求二叉树后序遍历和层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2

重建二叉树与二叉树的层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000).代表有t组測试数据.每组包含两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 演示样例输

二叉树的层次遍历 II

二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 标签 二叉树 队列 二叉树遍历 宽度优先搜索 1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int

二叉树的层次遍历和(叶子)节点

#include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 #define resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct { //定义队列 Bitree *base; int front; int r

树——二叉树的层次遍历

1,二叉树的遍历: 1,二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次: 1,层次就是访问的次序,层次遍历是先访问第一层.再第二层等: 2,考虑的问题: 1,通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动? 1,可以的,二叉树是一种特别的树: 2,通用树使用的算法可以移植到二叉树使用的场合: 3,设计思路(游标): 1,提供一组遍历相关的函数,按层次访问

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

lintcode 中等题:binary tree level order traversal ii 二叉树的层次遍历II

题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 解题 和上一题的答案反过来 直接每次在list中第一个位置加入当前层结点 /** * Definition of TreeNode: * public class TreeNode { *

二叉树的层次遍历和其深度

//二叉树的层次遍历和其深度#include <cstdio>#include <cstdlib>//define _OJ_#define maxsize 100typedef struct tree1{    char data;    struct tree1 *lchild;    struct tree1 *rchild;} tree1, *tree; typedef struct queue1{    tree data;    struct queue1 *next;}