[算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂

二叉树的DFS与BFS算法 (Java)

1.概念

①DFS (深度优先搜索)

维基百科读一遍
定义看完, 看一遍gif
在这里插入图片描述

②BFS (广度优先搜索)

维基百科读一遍
gif看一遍
在这里插入图片描述

2. 算法实现

二叉树节点结构:

public class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value){this.value = value;}
}

代码模拟实现:

import java.util.ArrayDeque;
import java.util.Stack;public class BinaryTree {TreeNode root;public BinaryTree(int[] array){root = makeBinaryTree(array, 1);}/*** 递归创建二叉树* @param array 数组* @param index 索引* @return 二叉链表示(二叉树)*/public static TreeNode makeBinaryTree(int[] array, int index){if (index < array.length){// index为根节点索引int value = array[index];// 排除为0的节点if (value != 0){TreeNode treeNode = new TreeNode(value);array[index] = 0;// 递归treeNode.left = makeBinaryTree(array, index * 2);treeNode.right = makeBinaryTree(array, index * 2 + 1);return treeNode;}}return null;}/*** 深度优先搜索遍历-先序遍历(先遍历根)* 非递归实现*/public void DFS(){if (root == null){System.out.println("empty tree");return;}// 栈, 先进后出Stack<TreeNode> stack = new Stack<>();stack.push(root);while(stack.isEmpty() == false){// 移除堆栈顶部对象,并作为次函数的值返回该对象TreeNode node = stack.pop();System.out.print(node.value + "  ");if (node.right != null){stack.push(node.right);}if (node.left != null){stack.push(node.left);}}System.out.println();}/*** 广度优先搜索* 非递归实现*/public void BFS(){if (root == null){System.out.println("empty tree");return;}// 队列, 先进先出ArrayDeque<TreeNode> treeNodes = new ArrayDeque<>();treeNodes.add(root);while (treeNodes.isEmpty() == false){// 删除队列中的第一个元素,并返回该元素的值TreeNode node = treeNodes.remove();System.out.print(node.value + "  ");if (node.left != null){treeNodes.add(node.left);}if (node.right != null){treeNodes.add(node.right);}}System.out.println();}public static void main(String[] args) {int[] arr = {0,14,11,13,23,53,1,8,0,9,45,78,99,0,0};BinaryTree tree = new BinaryTree(arr);tree.DFS();tree.BFS();}
}

运行结果:

深度优先搜索: 
14  11  23  9  53  45  78  13  1  99  8  
广度优先搜索: 
14  11  13  23  53  1  8  9  45  78  99    

其实二叉树可以看成这样:

深度优先搜索:14/       \11          13/   \       /    \23     53     1      8\    /  \   /9  45  78  99

痛定思痛, 不搞懂你永远都不懂!!!

看不懂的去debug, 一行一行看!!! 不要不懂装懂!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis返回map键值对_mybatis返回map key怎么指定

展开全部一、概述MyBatis中在查询进行select映射的时候&#xff0c;返回类型可以用resultType&#xff0c;也可以用resultMap&#xff0c;resultType是直接表示返回类型的&#xff0c;而resultMap则是对外部ResultMap的引用&#xff0c;636f7079323131333532363134313032313635…

[LeetCode] 485.最大连续 1 的个数(Java)

[LeetCode] 485.最大连续 1 的个数(Java) 1.题目描述 力扣传送门 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a;输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &…

两个音轨合并_两个双音轨mkv视频合并保持原双音轨不变 MKV怎么合并视频,合并之后仍保留MKV的双音轨...

在写文之前先说明下&#xff0c;笔者在双音轨处理方面接触不久&#xff0c;也只算是半吊子&#xff0c;离砖家级别还有些距离滴&#xff0c;若有不足的地方&#xff0c;欢迎大家补充哈。今天突然想到mkv视频合并的问题&#xff0c;就是MKV怎么合并视频&#xff0c;合并之后要保…

[LeetCode] 495. 提莫攻击 (Java)

[LeetCode] 495. 提莫攻击 (Java) 1.题目描述 在《英雄联盟》的世界中&#xff0c;有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希&#xff08;编者注&#xff1a;寒冰射手&#xff09;进入中毒状态。 当提莫攻击艾希&#xff0c;艾希的中毒状态正好持续 duration 秒…

conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解

Conv2d的简单使用torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似&#xff0c;但不完全一样。在 torch 中&#xff0c;Conv2d 有几个基本的参数&#xff0c;分别是in_channels 输入图像的深度out_channels 输出图像的深度kernel_size 卷积核大小&#xff0c;正方形卷积只为单…

Tomcat内存释放不了、Tomcat内存溢出原因

公司的tomcat又挂掉了,之前挂了一次.出现以下错误,后来把tomcat的内存增大到1024 严重: Exception initializing page context java.lang.OutOfMemoryError: Java heap space 在tomcat\bin\catalina.bat的set CURRENT_DIR%cd% 前面添加 set JAVA_OPTS -Xms5…

[LeetCode] 414.第三大的数(Java)

[LeetCode] 414.第三大的数(Java) 1.题目描述 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a;输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff…

win10 4k分屏 eclipse等工具打开后按钮图标大小问题解决方案

1、打开显示设置 2、打开eclipse属性、直接上图&#xff1a;

python用海伦公式求面积_Python:平面直角坐标系下用三点求所构三角形面积

我使用了一种特殊方式&#xff0c;计算平面直角坐标系下三点所构成&#xff08;如果可行的话&#xff09;的三角形的面积。这个方法&#xff0c;不同於常见的海伦公式。设此三点坐标分别为&#xff1a;算出最大最小的 与 &#xff0c;并根据三点坐标&#xff0c;虚构出一个矩形…

[LeetCode] 628. 三个数的最大乘积(Java)

[LeetCode] 628. 三个数的最大乘积(Java) 1.题目描述 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 1&#xff1a;输入&#xff1a;nums [1,2,3] 输出&#xff1a;6 示例 2&#xff1a;输入&#xff1a;nums …

[INS-30131] 执行安装程序验证所需的初始设置失败。

安装oracle11g或12C碰到“无法访问临时位置”的问题&#xff0c;详细信息如下&#xff1a; [INS-30131]执行安装程序验证所需的初始设置失败&#xff08;原因&#xff1a;无法访问临时位置&#xff09; 操作 - 请确保当前用户具有访问临时位置所需的权限。 解决方案1&#xff…

iview select 怎么清空_iView各种组件清空重置

表单注意事项&#xff1a; prop属性要和表单对象中的属性名一致html:重置js:data () {return {formFilter: {},}},methods: {handleReset (name) {// 或者手动将各个属性置空this.$refs[name].resetFields()}}穿梭框html: 首先通过ref获取到穿梭框ref"refTransfer"&g…

Navicat连接Mysql 8.0.16报错:Client does not support authentication protocol requested by server?

解决方法的命令如下&#xff1a; 切换到mysql安装目录下 &#xff1a;C:\Program Files\MySQL\MySQL Server 8.0\bin 登录进去执行以下命令 use mysql; alter user rootlocalhost identified with mysql_native_password by ********; flush privileges;

[LeetCode] 645. 错误的集合(Java)

[LeetCode] 645. 错误的集合(Java) 1.题目描述 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代…

android 结束if循环_(第五讲)if 分支语句和 while 循环

本文首发于微信公众号「烽哥带你学Android」&#xff0c;工作日每日更新1x0 switch 分支语句昨天我们最后学习了分支结构中的 if 条件语句。其实和 if 条件语句还有个兄弟 —— switch 分支语句。switch 语句由一个控制表达式和多个 case 标签组成。看到一堆 case 标签了吧&…

[LeetCode] 697. 数组的度(Java)

[LeetCode] 697. 数组的度(Java) 1.题目描述 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff…

判断输入的日期字符串是否小于当前日期

package com.wonders; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * 日期公共处理类 * author Liyongyong * */ public class DateUtils { /** * 判断是否是过去的日期 * para…

[LeetCode] 448. 找到所有数组中消失的数字(Java)

[LeetCode] 448. 找到所有数组中消失的数字(Java) 1.题目描述 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a;输入&#xf…

饥荒联机版连不上服务器_饥荒联机版无法连接klei服务器及刷不出服务器解决方法一览...

其实有时候连不上klei服务器和刷新不出服务器列表&#xff0c;是dns的问题。尤其一些三级宽带&#xff0c;像什么某城&#xff0c;某博士。就是被解析到了一个无法连通的服务器上。这时候换dns服务器&#xff0c;或者刷新dns缓存&#xff0c;直到找到一个能连通的服务器&#x…

Oracle12c部署,允许远程访问

Oracle的版本及类型&#xff1a;12c Oracle本地访问host为localhost&#xff0c;和其他关系型数据库mysql&#xff0c;sql server一样&#xff0c;Oracle远程访问同样需要修改host等参数。 因此&#xff0c;在部署Oracle前&#xff0c;需要确认的事只有一个&#xff1a;确保安…