二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)

二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)

深度優先遍歷:從根節點出發, 沿着左子樹的方向進行縱向遍歷,直到找到葉子節點爲之, 然後回溯到前一個節點, 進行右子樹節點的遍歷,直到遍歷完所有可達節點爲止
廣度優先遍歷: 從根節點出發,在橫向遍歷二叉樹層段節點的基礎上縱向遍歷二叉樹層次
           			  A
           			  
        	 B     			   C
        	
    	 D      E 		 	F   	G        

DFS: ABDECFG
BFS: ABCDEFG

非遞歸
DFS實現: 數據結構 (棧)

父節點入棧, 父節點出棧, 先右子節點入棧, 後左子節點入棧, 遞歸遍歷全部節點

public void depthFirstSearch(TreeNode root) {
	Stack<TreeNode> stack = new Stack<>();
	List<Integer> list = new ArrayList<>();
	if (null == root) return;
	stack.push(root);
	while (!stack.isEmpty()) {
		TreeNode node = stack.pop();
		list.add(node.val);
		if (node.right != null) {
			stack.push(node.right);
		}
		if (node.left != null) {
			stack.push(node.right);
		}
	}
}
BFS實現: 數據結構 (隊列)

父節點入隊,父節點出隊列,先左子節點入隊,後右子節點入隊。遞歸遍歷全部節點即可

public void breadthFirstSearch(TreeNode root) {
	Queue<TreeNode> queue = new Queue<>();
	List<Integer> list = new ArrayList<>();
	queue.push(root);
	while (!queue.isEmpty()) {
		TreeNode node = queue.pop();
		list.add(node.val);
		if (node.left != null) {
			queue.push(node.left);
		} 
		if (node.right != null) {
			queue.push(node.right);
		}
	}
}
遞歸
public void depthOrderTraversalWithRecursive(TreeNode root) {
	depthTraversal(root);
}

private void depthTraversal(TreeNode node) {
	if (null == node) return;
	depthTraversal(node.left);
	depthTraversal(node.right);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章