二叉树基本操作:利用队列实现层序遍历
利用队列实现层序遍历
关于二叉树其他的基本操作可以看我前几篇文章:
二叉树的基本操作:二叉树的后序遍历非递归算法
二叉树的遍历:前序非递归和中序非递归
二叉树基本操作:二叉树的创建与递归遍历
基础知识:
直接调用C++内部的queue
要有头文件 #include
队列的基本操作:
定义一个queue的变量 queue Q
查看是否为空范例 Q.empty() 是的话返回1,不是返回0;
从已有元素后面增加元素 Q.push()
输出现有元素的个数 Q.size()
返回第一个元素 Q.front()
显示最后一个元素 Q.back()
清除第一个元素 Q.pop()
程序执行时,输入
ABDH##I##E##CF#J##G##
创建如图所示的二叉树
代码如下:
#include <iostream>
#include <stack>
#include <queue>
using namespace std;typedef char datatype;//二叉树的左右链表示,也叫做二叉链表表示
typedef struct node {datatype data;struct node* lchild;struct node* rchild;
}Node;typedef Node* Btree;//创建新的结构体list,包含Btree和int,来帮助实现后序非递归算法
typedef struct list {Btree ptr;int flag;
}List;Btree preCreateBT() {Btree T;char ch;cin >> ch;if (ch == '#') {T = NULL;}else {T = new node;T->data = ch;T->lchild = preCreateBT();T->rchild = preCreateBT();}return T;
}//先序遍历
/*
void PreOrder(Btree BT) {if (BT != NULL) {cout << BT->data<<endl;PreOrder(BT->lchild);PreOrder(BT->rchild);}
}
*///中序遍历
/*
void InOrder(Btree BT) {if (BT != NULL) {InOrder(BT->lchild);cout << BT->data << endl;InOrder(BT->rchild);}
}
*///后序遍历
/*
void PostOrder(Btree BT) {if (BT != NULL) {PostOrder(BT->lchild);PostOrder(BT->rchild);cout << BT->data << endl;}
}
*///先序遍历非递归算法
/*
void PreOrderNoRecur(Btree root) {stack<Btree> S;while (root != NULL || !S.empty()) {while (root != NULL) {cout << root->data << endl;S.push(root);root = root->lchild;}if (!S.empty()) {root = S.top();S.pop();root = root->rchild;}}
}
*///中序遍历非递归算法
/*
void InOrderNoRecur(Btree root) {stack<Btree> S;while (root != NULL || !S.empty()) {while (root != NULL) {S.push(root);root = root->lchild;}if (!S.empty()) {root = S.top();cout << root->data << endl;S.pop();root = root->rchild;}}
}
*///后序遍历非递归算法
/*
void PostOrderNoRecur(Btree root) {stack<List> newS;while (root != NULL || !newS.empty()) {while (root != NULL) {List element;element.ptr = root;element.flag = 1;newS.push(element);root = root->lchild;}while (!newS.empty() && newS.top().flag == 2) {cout << newS.top().ptr->data << endl;newS.pop();}if (!newS.empty()) {newS.top().flag = 2;root = newS.top().ptr->rchild;}}}*///二叉树的层序遍历算法
void LevelOrder(Btree root) {queue<Btree> Q;Btree q;if (root == NULL) {return;}Q.push(root);while (!Q.empty()) {q = Q.front();cout << q->data << endl;Q.pop();if (q->lchild != NULL) {Q.push(q->lchild);}if (q->rchild != NULL) {Q.push(q->rchild);}}
}
int main() {//前序遍历创建树Btree TreeOne = preCreateBT();//先序遍历(递归)//PreOrder(TreeOne);//中序遍历(递归)//InOrder(TreeOne);//后序遍历(递归)//PostOrder(TreeOne);//先序遍历非递归算法//PreOrderNoRecur(TreeOne);//中序遍历非递归算法//InOrderNoRecur(TreeOne);//后序遍历非递归算法//PostOrderNoRecur(TreeOne);//利用队列实现层序遍历LevelOrder(TreeOne);
}
二叉树基本操作:利用队列实现层序遍历相关推荐
- 32、用队列实现层序遍历-102.二叉树的层序遍历
题目描述: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 . (即逐层地,从左到右访问所有节点). 思路:之前在剑指Offer中做过 使用队列先入先出的性质,实现层序遍历! DFS(深度优 ...
- LeetCode 958. 二叉树的完全性检验(层序遍历)
1. 题目 给定一个二叉树,确定它是否是一个完全二叉树. 百度百科中对完全二叉树的定义如下: 若设二叉树的深度为 h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的 ...
- LeetCode 993. 二叉树的堂兄弟节点(层序遍历)
文章目录 1. 题目 2. 解题 2.1 层序遍历 2.2 递归查找 1. 题目 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处. 如果二叉树的两个节点深度相同 ...
- 2021-10-11 ! LeetCode226. 翻转二叉树 的前中后层序遍历写法
还是遍历框架的应用 //! 二叉树的翻转:本质就是二叉树的遍历的应用 //! 以任意形式遍历二叉树的每一个结点,访问每一个结点的同时调换其左右子树 //! 中序遍历额外注意一下调换后的参数问题 Nod ...
- leetcode111. 二叉树的最小深度(层序遍历10)
一:题目 二:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* Tre ...
- 数据结构实验之二叉树五:层序遍历(STL和模拟队列两种方法)
Description 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input 输入数据有多行,第一行是一个整数t (t<1 ...
- 二叉树----层序遍历
1.层序遍历 层序遍历:层序遍历即逐层按顺序遍历二叉树的各个节点,故层序遍历又叫广度优先遍历. 如图:广度优先遍历即按ABCDEFGH的顺序遍历 2.解题思路 1.这里我们利用队列先进先出的结构特点, ...
- 102 二叉树层序遍历
层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组 BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列. 层序遍历相对于BFS, ...
- 二叉树的广度优先遍历(层序遍历)
先定义一个二叉树的结点 再创建二叉树,这里就不写了,之前的有创建二叉树的博客. 层序遍历 用到栈的思想, 1 先让根 节点进队列,2 然后读队顶元素,3 让他出队列4 打印它的值5 让队顶元素的左右子 ...
最新文章
- 模型裁剪--Rethinking the Value of Network Pruning
- 企业生产常用的磁盘管理方式介绍
- windows下DOS命令关闭占用的端口
- java web mvc思想介绍
- 为什么JavaScript现在和将来都是编程语言首选?
- 抓取标准报表ALV GRID上的数据
- ReactJS入门之ReactJS简介
- linux 字符串截取_第13篇:Linux防火墙的日志基本审计
- 访问艺术馆(codevs 1163)树形DP
- 一个简单的姓名生成器
- jquery api中文网址
- 安卓平板python编程软件下载_notepad++下载-notepad++中文版下载v7.6.2 中文增强版-西西软件下载...
- 在线教育开源源码:消费者如何规避线上教育“陷阱”营销?
- 对注册会计师CPA的简单了解
- 清除右键菜单多余的选项
- 文华学院计算机专业师资,华中科技大学文华学院“最受欢迎教师”名单
- 出现无法解析的外部符号 LZ4_decompress_safe等问题
- qt opengl 3d基本形状-螺旋管
- 下载Windows ISO镜像的方法 (超详细 适合新手入门)
- 将 多个空格 替换为一个逗号