树的深度优先遍历和广度优先遍历

  1 import java.util.ArrayDeque;
  2
  3 public class BinaryTree {
  4     static class TreeNode{
  5         int value;
  6         TreeNode left;
  7         TreeNode right;
  8
  9         public TreeNode(int value){
 10             this.value=value;
 11         }
 12     }
 13
 14     TreeNode root;
 15
 16     public BinaryTree(int[] array){
 17         root=makeBinaryTreeByArray(array,1);
 18     }
 19
 20     /**
 21      * 采用递归的方式创建一颗二叉树
 22      * 传入的是二叉树的数组表示法
 23      * 构造后是二叉树的二叉链表表示法
 24      */
 25     public static TreeNode makeBinaryTreeByArray(int[] array,int index){
 26         if(index<array.length){
 27             int value=array[index];
 28             if(value!=0){
 29                 TreeNode t=new TreeNode(value);
 30                 array[index]=0;
 31                 t.left=makeBinaryTreeByArray(array,index*2);
 32                 t.right=makeBinaryTreeByArray(array,index*2+1);
 33                 return t;
 34             }
 35         }
 36         return null;
 37     }
 38
 39     /**
 40      * 深度优先遍历,相当于先根遍历
 41      * 采用非递归实现
 42      * 需要辅助数据结构:栈
 43      */
 44     public void depthOrderTraversal(){
 45         if(root==null){
 46             System.out.println("empty tree");
 47             return;
 48         }
 49         ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();
 50         stack.push(root);
 51         while(stack.isEmpty()==false){
 52             TreeNode node=stack.pop();
 53             System.out.print(node.value+"    ");
 54             if(node.right!=null){
 55                 stack.push(node.right);
 56             }
 57             if(node.left!=null){
 58                 stack.push(node.left);
 59             }
 60         }
 61         System.out.print("\n");
 62     }
 63
 64     /**
 65      * 广度优先遍历
 66      * 采用非递归实现
 67      * 需要辅助数据结构:队列
 68      */
 69     public void levelOrderTraversal(){
 70         if(root==null){
 71             System.out.println("empty tree");
 72             return;
 73         }
 74         ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();
 75         queue.add(root);
 76         while(queue.isEmpty()==false){
 77             TreeNode node=queue.remove();
 78             System.out.print(node.value+"    ");
 79             if(node.left!=null){
 80                 queue.add(node.left);
 81             }
 82             if(node.right!=null){
 83                 queue.add(node.right);
 84             }
 85         }
 86         System.out.print("\n");
 87     }
 88
 89     /**
 90      *                  13
 91      *                 /   92      *               65    5
 93      *              /  \     94      *             97  25   37
 95      *            /    /\   /
 96      *           22   4 28 32
 97      */
 98     public static void main(String[] args) {
 99         int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};
100         BinaryTree tree=new BinaryTree(arr);
101         tree.depthOrderTraversal();
102         tree.levelOrderTraversal();
103     }
104 }
 
时间: 2024-10-14 21:09:42

树的深度优先遍历和广度优先遍历的相关文章

多级树的深度优先遍历与广度优先遍历(Java实现)

目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍历直接套用图结构的遍历方法即可. 工程中后端通常会用多级树来存储页面表单的各级联动类目,本文提供了深度遍历与广度遍历的示例,在使用时只要根据你的业务需求稍加改动即可. 我们知道,遍历有递归,非递归两种方式.在工程项目上,一般是禁用递归方式的,因为递归非

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表

基于邻接表存储的图的深度优先遍历和广度优先遍历

一.深度优先遍历是连通图的一种遍历策略.其基本思想如下: 设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y).若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过:然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边.上述过程直至从x出发的所有边都已检测过为止. 例如下图中: 1.从0开始,首先找到0的关

二分搜索树的深度优先遍历和广度优先遍历

二分搜索树的特点 二分搜索树首先是一个二叉树,其次其必须满足的条件是:每个节点的键值必须大于其左子节点,每个节点的键值必须小于其右子节点,这样以左右孩子为根的子树仍为二分搜索树,需要注意的是,二分搜索树不一定是一颗完全二叉树. 深度优先遍历 深度优先遍历的基本思想:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.深度优先遍历的非递归的通用做法是采用栈.要特别注意的是,二分搜索树的深度优先遍历比较特殊,可以细分为前序遍历.中序遍历.后序遍历. 前序遍历:先访问当前节点,再依次

树的深度优先遍历和广度优先遍历非递归实现.

注:树的深度优先遍历就是二叉树的先序遍历. 下面是代码. 1 package tooffer; 2 3 import java.util.LinkedList; 4 import java.util.Stack; 5 6 public class TreeNode { 7 int val = 0; 8 TreeNode left = null; 9 TreeNode right = null; 10 11 public TreeNode(int val) { 12 this.val = val;

树的深度优先遍历和广度优先遍历的原理和java实现代码

import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value){ this.value=value; } } TreeNode root; public BinaryTree(int[] array){ root=makeBinaryTreeByArray(array,

C++ 二叉树深度优先遍历和广度优先遍历

二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree root){ stack<Node *> nodeStack; //使用C++的STL标准模板库 nodeStack.push(root); Node *node; while(!nodeStack.empty()){ node = nodeStack.top(); printf(format, n

转:二叉树的深度优先遍历和广度优先遍历

转自:http://www.blogjava.net/fancydeepin/archive/2013/02/03/395073.html 深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止. 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为

二叉树的深度优先遍历和广度优先遍历

1. 二叉树的深度优先遍历,使用栈Stack, DFS(Depth First Search) function DFS(root){ var stack = []; stack.push(root); var node = null; while(stack.length){ node = stack.pop(); //visit node.data; if(node.right){ stack.push(node.right); } if(node.left){ stack.push(nod