樹的深度優先遍歷和廣度優先遍歷
深度優先遍歷(Depth First Search,DFS)和廣度優先遍歷(Breadth First Search,BFS)是兩種遍歷樹中元素的方式。
深度優先遍歷(DFS):
對於上述tree來說,DFS的遍歷結果爲:A B D E C F G
如果某個節點有子節點和兄弟節點,那麼優先遍歷子節點,左子樹優先於右子樹,直到子樹都被深度遍歷後,然後再遍歷兄弟節點及其子樹。
由於不會立馬遍歷兄弟子樹,使用棧來記錄未被遍歷的節點,這裏說一下爲何要使用棧結構,棧具有先進後出的特點,所以將不需要立馬遍歷的結點壓入棧後,也不會優先處理。
java實現
package tree;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class DFS {
//深度優先遍歷方法
public static void depthFirstSearch(Node root) {
Stack<Node> stack = new Stack<Node>();//在遍歷過程中存儲樹的結點信息,FILO的特點記錄了處理的順序
List<Node> list = new LinkedList<Node>();//存放遍歷結果
Node tempnode = root;
stack.push(tempnode);//根結點入棧
while(!stack.isEmpty()) {//當棧爲空,表示整棵樹已經全部被遍歷
tempnode = stack.pop();
list.add(tempnode);
if(tempnode.rightnode != null) {
stack.push(tempnode.rightnode);//將分支結點壓入棧,爲了保證先處理左子樹,再處理右子樹,必須先將右子樹壓入棧
}
if(tempnode.leftnode != null) {
stack.push(tempnode.leftnode);
}
}
for(Node tn :list) {
System.out.print(tn.val+",");
}
}
public static void main(String[] args) {
Node n1 = new Node(1);
Node n2= new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
Node n6 = new Node(6);
Node n7 = new Node(7);
n1.leftnode = n2;
n1.rightnode = n3;
n2.leftnode = n4;
n2.rightnode = n5;
n3.leftnode = n6;
n3.rightnode = n7;
DFS.depthFirstSearch(n1);
}
}
class Node{
int val;
Node leftnode;
Node rightnode;
Node(int val){
this.val = val;
}
}
廣度優先遍歷(BFS)
廣度優先遍歷和深度優先遍歷是相反的,即如果某個節點有子節點和兄弟節點,那麼優先遍歷兄弟節點。使用隊列的數據來存儲樹中的結點。
package tree;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class BFS {
public static void breadthFirstSearch(Node root) {
Node tempnode = root;
Queue<Node> queue = new LinkedList<Node>();
List<Node> list = new LinkedList<Node>();
queue.add(tempnode);
while(!queue.isEmpty()) {
tempnode = queue.remove();
list.add(tempnode);
if(tempnode.leftnode!= null) {
queue.add(tempnode.leftnode);
}
if(tempnode.rightnode != null) {
queue.add(tempnode.rightnode);
}
}
for(Node tn :list) {
System.out.print(tn.val+",");
}
}
public static void main(String[] args) {
Node n1 = new Node(1);
Node n2= new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
Node n6 = new Node(6);
Node n7 = new Node(7);
n1.leftnode = n2;
n1.rightnode = n3;
n2.leftnode = n4;
n2.rightnode = n5;
n3.leftnode = n6;
n3.rightnode = n7;
DFS.depthFirstSearch(n1);
}
}
class Node{
int val;
Node leftnode;
Node rightnode;
Node(int val){
this.val = val;
}
}