樹的DFS和BFS

菜鸟心得.... 不对请指出.......

/*BFS,广度优先搜索树,用最简单的2叉树来举例, 树的结构如下:           A     B                 C  D       E        F        GH    I  J    K   L     M  N     O广度优先搜索树, 顺序应该是ABCDEFGHIJKLMNO; 意思是,先搜索完 上一层的节点,再开始搜索下一层的节点;那么在BFS中, 会使用到一种数据结构----队列队列的特点是,先进先出,  就像一条水管一样,这头进,那头出。尾----------------------头->>  F E D C B A ->>>-------------------------从左边进去,只能从右边出来, 而先进去的,总是会先出来。利用队列的这个特点。1,先把根节点放进队列中。当队列不为空时,执行下列234,否则结束。2,取出队列的头,判断其value是否和x相同(X为要找的值),如果是,结束,否则删除 头元素 继续下一步。3,判断左子树是否为空,不为空,将左子树放进队列。4,判断右子树是否为空,不为空,将右子树放进队列。*/ 1 import java.util.Queue;
 2
 3 public class BFS {
 4     class tree {
 5         tree left;
 6         tree right;
 7         int value;
 8
 9         public tree(int value) {
10             this.value = value;
11         }
12     }
13
14     private Queue<tree> queue;
15
16     public void solution(tree node, int x) {
17         queue.add(node);
18         if (!queue.isEmpty()) {
19             if (queue.peek().value != x) {
20                 queue.remove();
21                 if (node.left != null) {
22                     queue.add(node.left);
23                 }
24                 if (node.right != null) {
25                     queue.add(node.right);
26                 }
27             }
28         }
29     }
30
31 }
 /*DFS,深度优先搜索树,还是用最简单的二叉树来举例,用最简单的办法,递归遍历。或者适用 stack这数据结构。*/ 1 import java.util.Stack;
 2
 3 public class dfs {
 4     class tree {
 5         tree left;
 6         tree right;
 7         int value;
 8
 9         public tree(int value) {
10             this.value = value;
11         }
12     }
13
14     private Stack<tree> stack = new Stack<tree>();
15
16     public void solution(tree node, int x) {
17         stack.add(node);
18         if (!stack.isEmpty()) {
19             if (stack.peek().value != x) {
20                 stack.pop();
21                 if (node.right != null) {
22                     stack.add(node.right);
23                 }
24                 if (node.left != null) {
25                     stack.add(node.left);
26                 }
27             }
28         }
29     }
30
31     public void solution2(tree node, int x) {
32         if (node.value != x) {
33             if (node.left != null) {
34                 solution2(node.left, x);
35             } else if (node.right != null) {
36                 solution2(node.left, x);
37             }
38         }
39     }
40 }
时间: 2024-10-02 17:14:00

樹的DFS和BFS的相关文章

学习笔记:图的DFS和BFS的两种搜索办法

  在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷. BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处. 在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队. 同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的. 1 void TraversalGraph_BFS(LGraph Gr

递归,回溯,DFS,BFS的理解和模板【摘】

递归:就是出现这种情况的代码: (或者说是用到了栈) 解答树角度:在dfs遍历一棵解答树 优点:结构简洁缺点:效率低,可能栈溢出 递归的一般结构: 1 void f() { 2 if(符合边界条件) { 3 /////// 4 return; 5 } 6 7 //某种形式的调用 8 f(); 9 } 回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的.回溯法可以被认为是一个有过剪枝的DFS过程.解答树角度:带回溯的dfs遍历一棵解答树回溯的一般结构: 1 void dfs(int

搜索分析(DFS、BFS、递归、记忆化搜索)

搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2)递归(从中间向两边) 1 //递归一定要写成记忆化递归 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool vis[11]; 5 int count1=0; 6 7 void search(int n){ 8 count1++; 9

数据结构(11) -- 邻接表存储图的DFS和BFS

/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS /////////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> using namespace std; //图的邻接表表示法

PAT 05-1 List Components (简单DFS与BFS)

刚一拿到这道题把他想的太复杂了 明明是长度最大为十的顺序结构就能解决的问题,竟然优先想到用链表. BFS牵扯到一个队列的操作,在这种小规模数据里面 用顺序结构好很多 题目如下: For a given undirected graph with N vertices and E edges, please list all the connected components by both DFS and BFS. Assume that all the vertices are numbered

hdu 4707 Pet(dfs,bfs)

Pet Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1548    Accepted Submission(s): 733 Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He sear

数据结构(12) -- 图的邻接矩阵的DFS和BFS

//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS //////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> #define MaxVertexNum 100 //最大顶点数 //#define INFINI

POJ 1426 Find The Multiple(DFS,BFS)

Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100

在DFS和BFS中一般情况可以不用vis[][]数组标记

开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]='#'; dfs(i,j); map[i][j]='.';} 一般情况都可以这样做.