二叉树的深度优先遍历(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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章