码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的遍历之 深度优先(DFS)和广度优先(BFS)

时间:2015-08-05 07:46:34      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:

深度优先遍历:

深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。

如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

技术分享
如图所示的二叉树:

A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。

那么,怎么样才能来保证这个访问的顺序呢?

分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。

因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,

这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。

深度优先遍历代码片段

 1 /**
 2      * 深度优先遍历,相当于先根遍历
 3      * 采用非递归实现
 4      * 需要辅助数据结构:栈
 5      */
 6     public void depthOrderTraversal(Node root){
 7         System.out.println("\n深度优先遍历");
 8         if(root==null){
 9             System.out.println("empty tree");
10             return;
11         }       
12         ArrayDeque<Node> stack=new ArrayDeque<Node>();
13         stack.push(root);       
14         while(stack.isEmpty()==false){
15             Node node=stack.pop();
16             System.out.print(node.data+ " ");
17             if(node.rightChild!=null){
18                 stack.push(node.rightChild);
19             }
20             if(node.leftChild!=null){
21                 stack.push(node.leftChild);
22             }           
23         }
24         System.out.print("\n");
25     }

 

广度优先遍历:

广度优先搜索算法(Breadth First Search),又叫宽度优先搜索,或横向优先搜索。

是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

如图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。
技术分享
那么,怎样才能来保证这个访问的顺序呢?

借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。

这样一来,左子树结点就存在队头,可以先被访问到。

广度优先遍历代码片段

 1     /**
 2      * 广度优先遍历
 3      * 采用非递归实现
 4      * 需要辅助数据结构:队列
 5      */
 6     public void levelOrderTraversal(Node root){
 7         System.out.println("广度优先遍历");
 8         if(root==null){
 9             System.out.println("empty tree");
10             return;
11         }
12         ArrayDeque<Node> queue=new ArrayDeque<Node>();
13         queue.add(root);
14         while(queue.isEmpty()==false){
15             Node node=queue.remove();
16             System.out.print(node.data+ " ");
17             if(node.leftChild!=null){
18                 queue.add(node.leftChild);
19             }
20             if(node.rightChild!=null){
21                 queue.add(node.rightChild);
22             }
23         }
24         System.out.print("\n");
25     }

 

 

 

 

Reference:

http://www.bkjia.com/ASPjc/978017.html

http://www.blogjava.net/fancydeepin/archive/2013/02/03/395073.html (代码是C++)

二叉树的遍历之 深度优先(DFS)和广度优先(BFS)

标签:

原文地址:http://www.cnblogs.com/hygeia/p/4703662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!