java之樹的遍歷

樹的深度優先遍歷和廣度優先遍歷

深度優先遍歷(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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章