原题出自百度的笔试:
简述树的深度优先及广度优先遍历算法,并说明非递归实现。
当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构:
深度优先遍历--->栈;
广度优先遍历--->队列;
这里以二叉树为例来实现。
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,1);
}
/**
* 采用递归的方式创建一颗二叉树
* 传入的是二叉树的数组表示法
* 构造后是二叉树的二叉链表表示法
*/
public static TreeNode makeBinaryTreeByArray(int[] array,int index){
if(index<array.length){
int value=array[index];
if(value!=0){
TreeNode t=new TreeNode(value);
array[index]=0;
t.left=makeBinaryTreeByArray(array,index*2);
t.right=makeBinaryTreeByArray(array,index*2+1);
return t;
}
}
return null;
}
/**
* 深度优先遍历,相当于先根遍历
* 采用非递归实现
* 需要辅助数据结构:栈
*/
public void depthOrderTraversal(){
if(root==null){
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();
stack.push(root);
while(stack.isEmpty()==false){
TreeNode node=stack.pop();
System.out.print(node.value+" ");
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
System.out.print("\n");
}
/**
* 广度优先遍历
* 采用非递归实现
* 需要辅助数据结构:队列
*/
public void levelOrderTraversal(){
if(root==null){
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();
queue.add(root);
while(queue.isEmpty()==false){
TreeNode node=queue.remove();
System.out.print(node.value+" ");
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
System.out.print("\n");
}
/**
* 13
* / \
* 65 5
* / \ \
* 97 25 37
* / /\ /
* 22 4 28 32
*/
public static void main(String[] args) {
int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};
BinaryTree tree=new BinaryTree(arr);
tree.depthOrderTraversal();
tree.levelOrderTraversal();
}
}
分享到:
相关推荐
"图的深度优先遍历和广度优先遍历算法" 图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。 图的深度优先遍历算法 ...
无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...
在邻接矩阵的存储结构下,实现图的深度优先遍历和广度优先遍历。
### 深度优先遍历与广度优先遍历 #### 概述 深度优先遍历(Depth-First Traversal, DFT)与广度优先遍历(Breadth-First Traversal, BFT)是图论中两种非常重要的遍历方法。这两种方法广泛应用于计算机科学中的...
在本文中,我们将深入探讨图的数据结构以及如何对图进行深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们要理解图的基本概念。图是一种数据结构,用于表示对象之间的关系,其中的对象称为顶点或节点,而它们...
### 图的存储与深度优先与广度优先遍历 #### C++实现的图的存储结构 在本篇文章中,我们将探讨图数据结构的存储方法及其两种主要的遍历算法:深度优先搜索(DFS)和广度优先搜索(BFS)。图是一种非线性的数据结构...
图的深度优先和广度优先遍历 本文主要讨论图的深度优先遍历和广度优先遍历的算法实现,包括获取图的所有边、输出邻接矩阵、图的深度遍历和广度优先遍历的实现。 获取图的所有边 在获取图的所有边时,我们需要定义...
本源文件CPP中代码使用深度优先和广度优先遍历图的算法。
javascript通过递归和栈实现树深度优先遍历和广度优先遍历
在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...
- `DFS(ALGraph G, int v)`和`BFS(ALGraph G, int v)`分别执行深度优先和广度优先遍历,输出访问序列。 - 边集的输出函数`DFSB(ALGraph G, int v)`和`BFSB(ALGraph G, int v)`记录遍历过程中形成的边。 7. **测试...
实现图的深度与广度优先遍历 c++6.0运行
### 图的深度、广度优先遍历(C语言) #### 概述 本文将详细介绍如何在C语言中实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方法是图论中最基本且重要的算法之一,在解决实际问题时有着广泛的...
"建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历" 本文档主要介绍了图的存储方式,包括邻接矩阵和邻接表两种存储方法,并在此基础上实现了图的深度优先遍历和广度优先遍历。 一、图...
根据给定文件的信息,我们可以总结出以下几个主要的知识点: ### 1. 图的定义与表示 ...以上就是关于图的建立及深度优先遍历和广度优先遍历的主要知识点。通过理解这些概念,可以帮助我们更好地分析和解决问题。
### 图的深度优先遍历与广度优先遍历 #### 一、引言 图是一种非线性数据结构,由顶点集和边集组成。其中顶点表示实体,而边则表示实体之间的关系。图的遍历是图的重要操作之一,它用于系统地访问图中的所有顶点。图...
本篇文章将深入探讨两种主要的图遍历算法:深度优先遍历(DFS,Depth-First Search)和广度优先遍历(BFS,Breadth-First Search),并提供C语言的实现。 **深度优先遍历(DFS)** 深度优先遍历是一种递归的策略,...
本资源是用C语言所写的,数据结构中图的创建及其相关的深度,广度遍历