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

二叉树的深度和广度优先搜索算法相关推荐

  1. 图的深度(DFS)/广度优先搜索算法(BFS)/Dijkstra

    类比二叉树先序遍历与图深度优先搜索 在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法. 二叉树的前序遍历算法: void Tr ...

  2. 七十九、深度和广度优先搜索算法

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 深度优先搜索和广度优先搜索作为应用广泛的搜索算法,一般是必考算法. ...

  3. 二叉树的深度和广度优先

    深度优先(借助栈): Depth First Search,对每一个分支路径深入到不能再深入为止,如图所示的二叉树遍历结果为:ABDECFHG private static void dfs(Tree ...

  4. Python实现 宽度/广度优先搜索算法, 深度优先搜索算法

    Python实现 宽度/广度优先搜索算法, 深度优先搜索算法 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 3. 深度优先搜索算法 4. 宽度/广度 ...

  5. 基于线性表邻接矩阵结构的图的深度/广度优先搜索算法

    // 图的存储和遍历 #include <iostream> using namespace std; // ------------------------------------ // ...

  6. 深度、广度优先生成树(C完整代码)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 二叉树的深度_[LeetCode 104] 二叉树的深度

    题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. ** 示例:** 给定二叉树 [3,9,20,null,n ...

  8. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  9. 【LeetCode】剑指 Offer 55 - I. 二叉树的深度

    [LeetCode]剑指 Offer 55 - I. 二叉树的深度 文章目录 [LeetCode]剑指 Offer 55 - I. 二叉树的深度 一.后序遍历(DFS) 二.层序遍历 一.后序遍历(D ...

最新文章

  1. debug.keystore文件不存在解决办法
  2. gpu programming guide for g80(dx9)
  3. firework常用快捷键
  4. 【杂谈】新手如何掌握深度学习模型?赠书2本,星球券10张
  5. php tp5支付宝app支付,支付宝APP支付 统一下单 php服务端 tp5
  6. 「软件项目管理」一文了解软件项目团队计划
  7. 485转换器产品功能特点及技术参数介绍
  8. icml和nips等各类重要会议论文收集
  9. Flutter进阶—布局一个控件
  10. 浮动Float(HTML、CSS)
  11. 分类计数原理与分步计数原理_两种基础的计数原理
  12. presto读取oracle,Presto数据接入方式
  13. MySQL(12)-----多表查询(内连接和外连接)
  14. 五、服务总线 - Bus
  15. NetSuite BOM材料产出率舍入
  16. android m是什么版本号,Android M版本号确定,并不是Android 6.0
  17. day36 cookiessession
  18. 怎样修改mysql密码
  19. Linux命令大全总结(看这一篇就够了)
  20. 回文判断 【问题描述】 回文是正读和倒读都一样的句子。读入一个最大长度不超过50个字符的句子,判断其是否是回文。 【输入形式】 输入一个最大长度不超过50个字符的句子 【输出形式】 Yes/No

热门文章

  1. 什么是CAS及其相关的配置
  2. html连接数据库id号自动生成器,SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)...
  3. java对象头_什么是Java对象标头
  4. 樊登读书分享ppt_樊登读书精华分享-《分手后,成为更好的自己》
  5. fastreport iif小于条件_杭州灭菌柜验证需要什么条件
  6. ajax 表格删除,jQuery AJAX删除只捕获第一个表格
  7. python200行代码小游戏_200 行python 代码实现 2048 游戏
  8. 微型计算机主板上安装的主要部件有,微型计算机的主板上安装的主要部件有()....
  9. python 网站模板_使用Python抓取模板之家的CSS模板
  10. 3像素尺寸是多少_纸张的尺寸