二叉树的BFS搜索

作者: taylar_where | 来源:发表于2019-05-19 14:59 被阅读1次

本人需要阅读代码,如果觉得阅读困难可以一步到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<TreeNode> queue=new LinkedList<TreeNode>();

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;

}

}

相关文章

  • 【算法训练营学习笔记-Week06】一遍不懂就多刷几遍

    字典树(Trie ) 温故知新: 树的定义 二叉树,前中序列遍历,层次遍历 DFS和BFS 二叉搜索树(BFS)定...

  • 2019-09-23 算法学习笔记一

    1.LeetCode 对应习题 1.102 二叉树的层次遍历(1)BFS 广度优先搜索a.level => que...

  • bfs (easy)

    二叉树的bfs:

  • 数据结构与算法图的遍历与图的应用

    1.广度优先搜索BFS类似于二叉树的层序遍历算法利用队列实现搜索 2.深度优先搜索DFS类似于树的先序遍历。搜索策...

  • BFS

    1.简介 BFS是Breadth First Search,中文翻译为宽度有限搜索。主要是出现在二叉树、数组(棋盘...

  • BFS/DFS python模板与实现

    BFS BFS在搜索完第k层的节点之前,是不会搜索第k+1层的节点的。 BFS原理 BFS所用的是队列。把每个还没...

  • 0102-二叉树的层次遍历

    二叉树的层次遍历 方案一 层序遍历二叉树是典型的广度优先搜索BFS的应用,但是这里稍微复杂一点的是,我们要把各个层...

  • 二叉树的BFS搜索

    本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在...

  • 搜索

    题目链接:搜索一·24点 dfs: 题目链接:搜索二·骑士问题 bfs: 题目链接:搜索三·八数码问题 bfs:

  • BFS和DFS

    BFS:广度优先搜索 DFS:深度优先搜索 树的遍历 BFS:A B C D E F G H I DFS: A ...

网友评论

    本文标题:二叉树的BFS搜索

    本文链接:https://www.haomeiwen.com/subject/yrcqzqtx.html