树的广度和深度遍历

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

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

BST和DST简单的matlab程序(图的广度和深度遍历)

图的广度和深度遍历,具体内容教材有 clc;clear all;close all; %初始化邻接压缩表compressTable=[1 2;1 3;1 4;2 4;2 5;3 6;4 6;4 7];max_vertex = max(compressTable(:)); %压缩表中最大值就是邻接矩阵的宽与高graph_matrix = compressTableToMatrix(compressTable);%从邻接压缩表构造图的矩阵表示[x,y] = cylinder(1,max_vertex

【数据结构】邻接表的广度与深度遍历

邻接表:数组和链表相结合的方法.图中顶点一般用一个一维数组存储,也可以用单链表存储,每个顶点的邻接点构成一个线性表,一般为单链表. 无向图: 有向图: 代码: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #defi

[广度遍历和深度遍历]聊聊算法和设计模式

晚上无聊写了个二叉树(图)的广度和深度遍历算法,算法本身很简单,但是如何做到通用呢,一下代码是我的设计,请大家帮忙看看有什么问题,我自己感觉有问题就是不知道具体什么问题 public interface IGraph<TVertex> { IEnumerable<IEdge<TVertex>> Edges { get; } } public interface IEdge<TVertex> { TVertex From { get; set; } TVert

JS 中的广度与深度优先遍历

现在有一种类似树的数据结构,但是不存在共同的根节点 root,每一个节点的结构为 {key: 'one', value: '1', children: [...]},都包含 key 和 value,如果存在 children 则内部会存在 n 个和此结构相同的节点,现模拟数据如下图: 已知一个 value 如 3-2-1,需要取出该路径上的所有 key,即期望得到 ['three', 'three-two', 'three-two-one']. 1.广度优先遍历 广度优先的算法如下图: 从上图可

图的深度遍历和广度遍历

概述 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的其它算法如求解图的连通性问题,拓扑排序,求关键路径等都是建立在遍历算法的基础之上. 由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点.② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以

Java 实现深度遍历和广度遍历数及其应用

一.深度遍历和广度遍历原理及实现 1.深度优先 英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧). 深度优先遍历各个节点,需要使用到堆(Stack)这种数据结构.stack的特点是是先进后出.整个遍历过程如下: 首先将A节点压入堆中,stack(A); 将A节点弹出,同时将A的子节点C,B压入堆中,此

树的高度,深度,层数和三种遍历方式

树的高度: 当只有一个根节点的时候,高度就是0. //计算树的高度int depth(Node node){ if(node == NULL) return -1; int l = depth(node->left); int r = depth(node->right); return (l < r)?(r+1):(l+1);//当只有一个根节点的时候,高度就是-1+1=0} 层数: 树的高度最底下的为第1层(有的书定义为第0层),依次向上累加 树的深度: 完全二叉树是指这样的二叉树:

邻接表广度深度遍历

#include<iostream> #include<queue> using namespace std; const int MaxVertexNum = 100; bool visited[MaxVertexNum]; int relationNonDir[][2] = {{0,1},{0,2},{1,2},{1,3},{2,6},{2,5},{3,5},{3,4},{4,5}};////无向图 class EdgeNode{ public: int val; int we

第五章 图的遍历(深度遍历,广度遍历,城市地图,最少转机)

深度和广度优先搜索: 单词分解:首先是搜索 深度和广度:是针对图的遍历而言的 图:由顶点和边组成 图的遍历:把图中每一个顶点都访问一次 一: 输入: 5 5(顶点数,边数) 1 2 1 3 1 5 2 4 3 5 输出: 1 2 4 3 5 (按时间戳输出)深度遍历 1 2 3 5 4 (按时间戳输出)广度遍历 1 #include <stdio.h> 2 int map[10][10], book[10], n, m,sum; 3 void dfs(int cur) 4 { 5 int i;