[Tree Breadth First Search] 二叉树的层序遍历

2023-10-28 11:00

本文主要是介绍[Tree Breadth First Search] 二叉树的层序遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

leetcode 102,Binary Tree Level Order Traversal,难度 medium

树上的BFS,Tree Breadth First Search这个标题更新,二叉树广度优先搜素算法处理的相关题目。

DFS(Deep First Search)深度优先搜索,BFS(Breath First Search)广度优先搜索的区别如下图。
在这里插入图片描述

0. 题干

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

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

在这里插入图片描述

返回其层次遍历结果:

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

1. 代码

/*** 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<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que; //构造队列que,里面的元素都是TreeNode*类型的指针que.push(root);vector<vector<int>> res;  //二维数组while (que.size() != 0) {int size = que.size();vector<int> level;while (size --) {TreeNode* cur = que.front();que.pop();if (!cur) {continue;}level.push_back(cur->val);que.push(cur->left);que.push(cur->right);}if (level.size() != 0) {res.push_back(level);}}return res;}
};

2. 代码流程详叙

2.1 第一层

oot为结点1的地址(他里面的val值是3),
构造队列que,里面的元素都是TreeNode*类型的指针,
把root指针存到队列里面,
构造二维数组res,里面存储的元素int型,

此时que.size=1,进入最外面的while循环,
此时size=1;
定义一维数组level,

进入while(size --)循环,size–为0
cur存储结点1地址,
que.pop(),把刚才存到que里面的指针元素(结点1)地址清除,

cur地址存在,不为NULL,所以不管continue语句,

把结点1的val值存到level数组里面,再依次把结点1的左右结点的地址存到队列que里面去;

size为0,所以内while循环不继续,进入下面的if 语句,

此时level.size()为1,把level的地址存到res里面,即第一层二叉树的元素被存到res了。

2.2 第二层

que.size() 为2,进入最外面while循环,

size值为2,再定义一个数组level,注意这个level和之前的不一样,地址不同,

size为2,进入内while循环,size–为1,
cur指向结点1的左结点,即存储元素9的地址,

que队列清除元素9的地址,
cur不为NULL,所以还是别管continue;

把元素9存到level数组里面,
元素9对应结点的左右结点都没有,所以存了两个NULL进入队列;

再次内while循环,size–为0,

cur指向元素20对应的地址,
que队列清除元素20的地址,cur不为NULL,调过continue,

然后把元素20存到level数组里面,再把元素15、元素7对应的地址存到队列里面,

size为0,结束内while循环,

level.size()值为2,把存储了元素9、元素20的一维数组的地址,存到二维数组res里面,即第二层二叉树的元素被存好了。

2.3 第三层

que.size()为4,不为0,进入外面的while大循环,

size=4,
再次定义新的一维数组level,
size为4,进入内while循环,size–,为3.
cur指向NULL;

que队列清除一个NULL,
进入continue语句,跳过剩下的代码,继续下一个while循环,size–为2

cur指向下一个NULL,
还是走continue,调过剩下的代码,继续下一个while循环,size–为1

cur存储元素15对应的地址,
que队列清除元素15对应的地址,

把元素15存到新的一维数组level里面,把元素15对应结点的左右结点存到队列里面,就是存了两个NULL,

进入内while循环,size–为0,
cur存储元素7对应的地址,

que队列清除元素7对应的地址,跳过continue语句,
把元素7存到一维数组level里面,再把元素7的左右结点存到队列里面,就是再存了两个NULL,

level.size()为2,把依次存储了元素15、元素7的一维数组level,的地址存到二维数组res里面,即第三层二叉树的元素被存好了。

2.4 结束

还要再来一次判断:

que.size()为4,不为0,进入外面的while大循环,由于队列存了四个NULL,所以一直走四次continue语句,

level.size值为0,队列que一直pop,最终que.size()也为0,所有代码运行结束,

返回 res;

这篇关于[Tree Breadth First Search] 二叉树的层序遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292757

相关文章

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具