二叉树的深度和广度优先搜索算法
Java实现二叉树的深度和广度优先搜索算法
1 package com.java; 2 3 import java.util.ArrayDeque; 4 5 /** 6 * 广度优先搜索 7 * 算法思路:首先访问起始顶点v,然后由v出发,依次访问v的各个未被访问过的邻接顶点w1,w2,w3….wn, 8 * 然后再依次访问w1,w2,…,wn的所有未被访问过的邻接顶点,再从这些访问过的顶点出发, 9 * 再访问它们所有未被访问过的邻接顶点….以此类推,直到所有的顶点都被访问过为止。 10 * 11 * 深度优先遍历 12 * 算法思路:首先访问该顶点v,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图, 13 * 直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点, 14 * 重复上述过程,直至所有顶点都被访问到为止。 15 */ 16 17 public class BinaryTree { 18 static class TreeNode{ 19 int value; 20 TreeNode left; 21 TreeNode right; 22 23 public TreeNode(int value){ 24 this.value=value; 25 } 26 } 27 28 TreeNode root; 29 30 public BinaryTree(int[] array){ 31 root=makeBinaryTreeByArray(array,1); 32 } 33 34 /** 35 * 采用递归的方式创建一颗二叉树 36 * 传入的是二叉树的数组表示法 37 * 构造后是二叉树的二叉链表表示法 38 */ 39 public static TreeNode makeBinaryTreeByArray(int[] array,int index){ 40 if(index<array.length){ 41 int value=array[index]; 42 if(value!=0){ 43 TreeNode t=new TreeNode(value); 44 array[index]=0; 45 t.left=makeBinaryTreeByArray(array,index*2); 46 t.right=makeBinaryTreeByArray(array,index*2+1); 47 return t; 48 } 49 } 50 return null; 51 } 52 53 /** 54 * 深度优先遍历,相当于先根遍历 55 * 采用非递归实现 56 * 需要辅助数据结构:栈 57 */ 58 public void depthOrderTraversal(){ 59 if(root==null){ 60 System.out.println("empty tree"); 61 return; 62 } 63 ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>(); 64 stack.push(root); 65 while(stack.isEmpty()==false){ 66 TreeNode node=stack.pop(); 67 System.out.print(node.value+" "); 68 if(node.right!=null){ 69 stack.push(node.right); 70 } 71 if(node.left!=null){ 72 stack.push(node.left); 73 } 74 } 75 System.out.print("\n"); 76 } 77 78 /** 79 * 广度优先遍历 80 * 采用非递归实现 81 * 需要辅助数据结构:队列 82 */ 83 public void levelOrderTraversal(){ 84 if(root==null){ 85 System.out.println("empty tree"); 86 return; 87 } 88 ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>(); 89 queue.add(root); 90 while(queue.isEmpty()==false){ 91 TreeNode node=queue.remove(); 92 System.out.print(node.value+" "); 93 if(node.left!=null){ 94 queue.add(node.left); 95 } 96 if(node.right!=null){ 97 queue.add(node.right); 98 } 99 } 100 System.out.print("\n"); 101 } 102 103 /** 104 * 13 105 * / \ 106 * 65 5 107 * / \ \ 108 * 97 25 37 109 * / /\ / 110 * 22 4 28 32 111 */ 112 public static void main(String[] args) { 113 int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0}; 114 BinaryTree tree=new BinaryTree(arr); 115 System.out.println("深度优先遍历结果为:"); 116 tree.depthOrderTraversal(); 117 System.out.println("广度优先遍历结果为:"); 118 tree.levelOrderTraversal(); 119 } 120 }
转载于:https://www.cnblogs.com/weijuanran/p/BinaryTreeSearch.html
二叉树的深度和广度优先搜索算法相关推荐
- 图的深度(DFS)/广度优先搜索算法(BFS)/Dijkstra
类比二叉树先序遍历与图深度优先搜索 在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法. 二叉树的前序遍历算法: void Tr ...
- 七十九、深度和广度优先搜索算法
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 深度优先搜索和广度优先搜索作为应用广泛的搜索算法,一般是必考算法. ...
- 二叉树的深度和广度优先
深度优先(借助栈): Depth First Search,对每一个分支路径深入到不能再深入为止,如图所示的二叉树遍历结果为:ABDECFHG private static void dfs(Tree ...
- Python实现 宽度/广度优先搜索算法, 深度优先搜索算法
Python实现 宽度/广度优先搜索算法, 深度优先搜索算法 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 3. 深度优先搜索算法 4. 宽度/广度 ...
- 基于线性表邻接矩阵结构的图的深度/广度优先搜索算法
// 图的存储和遍历 #include <iostream> using namespace std; // ------------------------------------ // ...
- 深度、广度优先生成树(C完整代码)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 二叉树的深度_[LeetCode 104] 二叉树的深度
题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. ** 示例:** 给定二叉树 [3,9,20,null,n ...
- bfs广度优先搜索算法_图的广度优先搜索(BFS)
bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...
- 【LeetCode】剑指 Offer 55 - I. 二叉树的深度
[LeetCode]剑指 Offer 55 - I. 二叉树的深度 文章目录 [LeetCode]剑指 Offer 55 - I. 二叉树的深度 一.后序遍历(DFS) 二.层序遍历 一.后序遍历(D ...
最新文章
- debug.keystore文件不存在解决办法
- gpu programming guide for g80(dx9)
- firework常用快捷键
- 【杂谈】新手如何掌握深度学习模型?赠书2本,星球券10张
- php tp5支付宝app支付,支付宝APP支付 统一下单 php服务端 tp5
- 「软件项目管理」一文了解软件项目团队计划
- 485转换器产品功能特点及技术参数介绍
- icml和nips等各类重要会议论文收集
- Flutter进阶—布局一个控件
- 浮动Float(HTML、CSS)
- 分类计数原理与分步计数原理_两种基础的计数原理
- presto读取oracle,Presto数据接入方式
- MySQL(12)-----多表查询(内连接和外连接)
- 五、服务总线 - Bus
- NetSuite BOM材料产出率舍入
- android m是什么版本号,Android M版本号确定,并不是Android 6.0
- day36 cookiessession
- 怎样修改mysql密码
- Linux命令大全总结(看这一篇就够了)
- 回文判断 【问题描述】 回文是正读和倒读都一样的句子。读入一个最大长度不超过50个字符的句子,判断其是否是回文。 【输入形式】 输入一个最大长度不超过50个字符的句子 【输出形式】 Yes/No
热门文章
- 什么是CAS及其相关的配置
- html连接数据库id号自动生成器,SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)...
- java对象头_什么是Java对象标头
- 樊登读书分享ppt_樊登读书精华分享-《分手后,成为更好的自己》
- fastreport iif小于条件_杭州灭菌柜验证需要什么条件
- ajax 表格删除,jQuery AJAX删除只捕获第一个表格
- python200行代码小游戏_200 行python 代码实现 2048 游戏
- 微型计算机主板上安装的主要部件有,微型计算机的主板上安装的主要部件有()....
- python 网站模板_使用Python抓取模板之家的CSS模板
- 3像素尺寸是多少_纸张的尺寸