【数据结构与算法】十六 二叉树遍历 BFS 广度优先 递归算法
来源:互联网 发布:女神联盟英雄升阶数据 编辑:程序博客网 时间:2024/05/17 01:52
【数据结构与算法】十六 二叉树遍历 Breadth-First-Search 广度优先
Breadth-First-Search 广度优先
广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。
以层为单位进行遍历.如图
- 广度优先遍历与深度优先遍历的区别在于:广度优先遍历是以层为顺序,将某一层上的所有节点都搜索到了之后才向下一层搜索;而深度优先遍历是将某一条枝桠上的所有节点都搜索到了之后,才转向搜索另一条枝桠上的所有节点。
- 深度优先遍历从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续找它的下一个新的顶点进行访问,重复此步骤,直到所有结点都被访问完为止。
- 广度优先遍历从某个顶点出发,首先访问这个顶点,然后找出这个结点的所有未被访问的邻接点,访问完后再访问这些结点中第一个邻接点的所有结点,重复此方法,直到所有结点都被访问完为止。
- 可以看到两种方法最大的区别在于前者从顶点的第一个邻接点一直访问下去再访问顶点的第二个邻接点;后者从顶点开始访问该顶点的所有邻接点再依次向下,一层一层的访问。
Java实现
package com.cn.mark.algorithm.binarytree;/** * Created by mark on 6/19/16. */public class BSTBreadth { Node root = null; class Node { int value; int position; Node left = null, right = null; Node(int value, int position){ this.value = value; this.position = position; } } public void add(int value, int position){ if(root == null){ root = new Node(value, position); } else { add(value, position, root); } } private void add(int value, int position, Node node){ if(node == null) throw new RuntimeException("treenode cannot be null"); if(node.value == value) return; //ignore the duplicated value if(value < node.value){ if(node.left == null){ node.left = new Node(value, position); }else{ add(value, position, node.left); } }else{ if(node.right == null){ node.right = new Node(value, position); }else{ add(value, position, node.right); } } } public int depth(){ return depth(root); } private int depth(Node node){ if(node == null) return 0; int leftDepth = depth(node.left); int rightDepth = depth(node.right); return Math.max(leftDepth, rightDepth) + 1; } public void levelOrder(){ int depth = depth(); for(int level = 0; level < depth; level ++){ printLevel(root, level); System.out.println("\n-------------------"); } } private void printLevel(Node node, int level){ if(node == null) return; if(level == 0){ System.out.print(" " + node.value); }else{ printLevel(node.left, level - 1); printLevel(node.right, level - 1); } } public static void main(String[] args) { BSTBreadth bst = new BSTBreadth(); int a[] = {3,7,8,4,2,5,9,0,6,1}; for(int i = 0; i < a.length; i++){ bst.add(a[i], i); } bst.levelOrder(); }}
结果
以层级输出
0 0
- 【数据结构与算法】十六 二叉树遍历 BFS 广度优先 递归算法
- 【数据结构与算法】十九 二叉树遍历 BFS 广度优先 迭代算法
- 算法与数据结构(2) -- 二叉树深度优先遍历和广度优先遍历
- 【数据结构与算法】二叉树广度遍历
- 数据结构 - 二叉树的广度优先遍历算法(C++)
- BFS广度优先遍历算法
- 二叉树深度优先遍历、广度优先遍历、非递归遍历算法
- 二叉树深度优先(DFS)和广度优先(BFS)算法的非递归实现
- 【数据结构与算法】十五 二叉树遍历 DFS 深度优先 递归算法
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
- 深度优先遍历与广度优先遍历(c++二叉树算法实现)
- 【数据结构与算法】二叉树递归与非递归遍历
- 广度优先遍历BFS的图算法
- 树的广度优先遍历与深度优先遍历算法
- 树的广度深度优先遍历算法 DFS BFS
- 图的深度优先遍历(递归与非递归算法)和广度优先遍历
- 广度优先算法BFS
- 整合Kafka到Spark Streaming——代码示例和挑战
- android打开系统程序
- Java-多线程
- 【Stanford机器学习笔记】6-Neural Networks: Representation
- 集群session共享机制
- 【数据结构与算法】十六 二叉树遍历 BFS 广度优先 递归算法
- 跨服务器Session共享的四种方法
- IO学习(九)字节缓冲流,字符缓冲流
- 阅读需要马上开始------每天时时刻刻要在心中默念
- OSGI与cxf结合发布rest接口
- 剑指offer 面试题51 java实现
- DP 动态规划 Problem J 1010 上楼梯问题
- Condition的理解
- android发送短信