本人需要阅读代码,如果觉得阅读困难可以一步到CSDN

代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解。

广度优先搜索算法(Breadth First Search),又叫宽度优先搜索,或横向优先搜索。

搜索是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。如右图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。

一个满二叉树

那么,怎样才能来保证这个访问的顺序呢?

借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。

这样一来,左子树结点就存在队头,可以先被访问到。

程序代码如下

import java.util.LinkedList;

/**

* 二叉树的广度优先搜索:我们在二叉树T中搜索节点N是否存在?

* @author

* 针对这样一个问题,我们要考虑一下如何解决以下几个问题:

* 1.使用什么样的数据结构表示 树

*  我们可创建一个类TreeNode,该类包含的属性应该有:节点名,左孩子,右孩子, 父节点  使用二叉链表

*

* 2.如何规范输入格式,能够方便我们进行树的初始化?

*  通过树的中序遍历和先序遍历来进行对数的初始化

*

*/

public class Tree {

private TreeNode rootNode;

/**

*

* @param bef 先序遍历字符串

* @param mid 中序遍历字符串

* @return 树的根节点

*/

public TreeNode creatTree(String bef,String mid) {

String root=bef.substring(0, 1);

int rootindex=mid.indexOf(root);

//System.out.println(rootindex);

String leftBef=bef.substring(1, rootindex+1);

String leftMid=mid.substring(0, rootindex);

//System.out.println("left child:"+leftBef+"    "+leftMid);

TreeNode lchild=initTree(leftBef,leftMid);

int len=mid.length();

String rightBef=bef.substring(rootindex+1,len);

String rightMid=mid.substring(rootindex+1,len);

//System.out.println("right child:"+rightBef+"    "+rightMid);

TreeNode rchild=initTree(rightBef,rightMid);

rootNode=new TreeNode(root, lchild, rchild);

return rootNode;

}

/**

* 递归

* @param bef

* @param mid

* @return

*/

public TreeNode initTree(String bef,String mid) {

if(bef.length()==1&&mid.length()==1) {

return new TreeNode(bef, null, null);

}

//if(bef.length()==2&&mid.length()==2) {  //左子树为空或者右子树为空时

//if(bef.charAt(0)==mid.charAt(0)) {

//return new TreeNode(bef.substring(0,1), null, new TreeNode(bef.substring(1,2), null, null));

//}else {

//return new TreeNode(bef.substring(0,1), new TreeNode(mid.substring(0,1), null, null), null);

//}

//}

String root=bef.substring(0, 1);

int rootindex=mid.indexOf(root);

String leftBef=bef.substring(1, rootindex+1);

String leftMid=mid.substring(0, rootindex);

TreeNode lchild=null;

if(leftBef.length()==leftMid.length()&&leftBef.length()!=0) {  //不为空时

lchild=initTree(leftBef,leftMid);

}

int len=mid.length();

String rightBef=bef.substring(rootindex+1,len);

String rightMid=mid.substring(rootindex+1,len);

TreeNode rchild=null;

if(rightMid.length()==rightBef.length()&&rightBef.length()!=0) {

rchild=initTree(rightBef,rightMid);

}

TreeNode rootNode=new TreeNode(root, lchild, rchild);

return rootNode;

}

public static void main(String[] args) {

Tree tree=new Tree();

//System.out.println(tree.rootIndex("ASDFG", "S2"));

//System.out.println("ASF".substring(0, 1));

TreeNode tree2 = tree.creatTree("ABDECFGHI", "DBEAGFHIC");

tree.treeBFS("L");

}

//通过BFS搜索 节点N是否存在

public void treeBFS(String N) {

LinkedList queue=new LinkedList();

queue.add(rootNode); //将根节点加入队列中

while(!queue.isEmpty()) {

TreeNode node = queue.poll();

if(node.lchild!=null) {

queue.add(node.lchild);

}

if(node.rchild!=null) {

queue.add(node.rchild);

}

System.out.print(node.nodeName+" ");

if(node.nodeName.equals(N)) {

System.out.println("节点存在二叉树中");

return;

}

}

System.out.println("\n节点不存在");

}

}

/**

* 内部节点类

* @author 曾鹏

*

*/

class TreeNode{

public String nodeName;

public TreeNode lchild;

public TreeNode rchild;

//public TreeNode parent;

public TreeNode(String nodeName,TreeNode lchild,TreeNode rchild) {

this.nodeName=nodeName;

this.lchild=lchild;

this.rchild=rchild;

//this.parent=parent;

}

}

java灌水bfs二叉树,二叉树的BFS搜索相关推荐

  1. 二叉树中进行 BFS 和图中进行 BFS 最大的区别

    二叉树中进行 BFS 和图中进行 BFS 最大的区别 就是二叉树中无需使用 HashSet(C++: unordered_map, Python: dict) 来存储访问过的节点(丢进过 queue ...

  2. BFS模版题----水缸灌水(c++)

    先挂题目: 水缸灌水 题目描述 有两个无刻度标志的水壶,分别可装x升和y升(x,y为整数,x.y<=100)的水.设另一方面有一水缸,可用来向水壶灌水或倒出水,两水壶间,水也可以相互倾灌.已知x ...

  3. java 二叉树特点_疯狂java笔记之树和二叉树

    树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定义和基本术语 计算机世界里的树,是从自然界中实际的树抽象而来的,它指的是N个有父子关系 ...

  4. 【Java数据结构】顺序存储的二叉树

    顺序存储的二叉树 二叉树数据结构 二叉树的遍历 先序遍历 中序遍历 后序遍历 二叉树示例完整代码 二叉树类 ArrayBinaryTree 测试类 TestArrayBinaryTree 二叉树数据结 ...

  5. CSDN自动回复灌水乐园帖子-httpClient篇

    package com.ws; import java.io.IOException; import java.util.ArrayList; import java.util.List; //1.首 ...

  6. 二本学生连发10篇SCI直博香港城大,被质疑「灌水」,本人回应!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文来源:青塔人才.知乎Molecule 7月10日,来自徐州工程学 ...

  7. 别再SOTA了,那叫“微调”!Science发文炮轰论文灌水

    点击上方"视学算法",选择加"星标"置顶 重磅干货,第一时间送达 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI AI算法的发展,真有那么迅猛吗? ...

  8. 同盾反欺诈云防垃圾灌水帖体验分享

    年初将留言本改成了松松论坛,解决了留言本很多问题,也有了互动性,增强了粘性. 不过随后遇到了很多问题,尤其是垃圾贴的问题困扰了我们很久,有一段时间有人用论坛群发器发布了很多垃圾贴,原本只有几千条的帖子 ...

  9. 丢人现眼……GitHub阿波罗11号代码仓库惨遭中文灌水

    问耕 发自 凹非寺 量子位 出品 | 公众号 QbitAI 这不是一件光彩的事情. 昨天登上GitHub趋势热榜第一的阿波罗11号(Apollo 11)代码仓库,获得了3万多标星称赞,但也同时惨遭中文 ...

最新文章

  1. “中文版GPT-3”来了!用64张V100训练了3周
  2. Qt 控制台 使用connect连接信号和槽
  3. wxWidgets:wxContextMenuEvent类用法
  4. 用maya怎么做ak47_方铁做木纹用水性木纹漆怎么样?
  5. php json返回sql,php – 如何从我的特定SQL查询中返回json?
  6. java 输出ssl握手信息_使用Java的SSL握手错误
  7. [Mac]一些命令技巧
  8. HDU 5652 India and China Origins(二分 + BFS)
  9. html5录音功能代码,recorder.js 基于 HTML5 实现录音功能
  10. 2017.8.5 One-Dimensional 思考记录
  11. LINUX系统管理与应用
  12. AC日记——[HNOI2012]永无乡 bzoj 2733
  13. HTML5 3D翻书效果(双面效应)
  14. Bigemap中添加离线地图数据包 教程
  15. 楼板计算塑形弹性_土木吧丨弹性与弹塑性计算差异性分析
  16. 网站SEO优化:遇到死链接就这样解决
  17. MSU转Uniprot转Entrez ID
  18. 使用UDP遇到的问题小结
  19. NHibernate 联合查询,解决方法-通过自动转换成DataTable
  20. win11安装wsl2及linux系统安装anaconda cuda tensorrt

热门文章

  1. Allegro通孔电气焊盘
  2. 3 步完全掌握 LoRaWAN Server,让你拥有自己的物联网
  3. RT-Thread 4.1.0 特性解析之LIBC与POSIX
  4. 2019日本Summer Sonic音乐节攻略(明星阵容)
  5. 手写Android热修复
  6. 10、VUE组件基本使用
  7. 电报被人胡乱拉群解决办法
  8. 加装机械硬盘遇到的错误
  9. echarts的中国地图,点击进入省级地图,点击省级地图,返回中国地图
  10. 实验三:Windows7操作系统安全