二叉树的DFS与BFS算法 (Java)
1.概念
①DFS (深度优先搜索)
维基百科读一遍
定义看完, 看一遍gif
②BFS (广度优先搜索)
维基百科读一遍
gif看一遍
2. 算法实现
二叉树节点结构:
public class TreeNode {
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value = value;
}
}
代码模拟实现:
import java.util.ArrayDeque;
import java.util.Stack;
public class BinaryTree {
TreeNode root;
public BinaryTree(int[] array){
root = makeBinaryTree(array, 1);
}
/**
* 递归创建二叉树
* @param array 数组
* @param index 索引
* @return 二叉链表示(二叉树)
*/
public static TreeNode makeBinaryTree(int[] array, int index){
if (index < array.length){
// index为根节点索引
int value = array[index];
// 排除为0的节点
if (value != 0){
TreeNode treeNode = new TreeNode(value);
array[index] = 0;
// 递归
treeNode.left = makeBinaryTree(array, index * 2);
treeNode.right = makeBinaryTree(array, index * 2 + 1);
return treeNode;
}
}
return null;
}
/**
* 深度优先搜索遍历-先序遍历(先遍历根)
* 非递归实现
*/
public void DFS(){
if (root == null){
System.out.println("empty tree");
return;
}
// 栈, 先进后出
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(stack.isEmpty() == false){
// 移除堆栈顶部对象,并作为次函数的值返回该对象
TreeNode node = stack.pop();
System.out.print(node.value + " ");
if (node.right != null){
stack.push(node.right);
}
if (node.left != null){
stack.push(node.left);
}
}
System.out.println();
}
/**
* 广度优先搜索
* 非递归实现
*/
public void BFS(){
if (root == null){
System.out.println("empty tree");
return;
}
// 队列, 先进先出
ArrayDeque<TreeNode> treeNodes = new ArrayDeque<>();
treeNodes.add(root);
while (treeNodes.isEmpty() == false){
// 删除队列中的第一个元素,并返回该元素的值
TreeNode node = treeNodes.remove();
System.out.print(node.value + " ");
if (node.left != null){
treeNodes.add(node.left);
}
if (node.right != null){
treeNodes.add(node.right);
}
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {0,14,11,13,23,53,1,8,0,9,45,78,99,0,0};
BinaryTree tree = new BinaryTree(arr);
tree.DFS();
tree.BFS();
}
}
运行结果:
深度优先搜索:
14 11 23 9 53 45 78 13 1 99 8
广度优先搜索:
14 11 13 23 53 1 8 9 45 78 99
其实二叉树可以看成这样:
深度优先搜索:
14
/ \
11 13
/ \ / \
23 53 1 8
\ / \ /
9 45 78 99
痛定思痛, 不搞懂你永远都不懂!!!
看不懂的去debug, 一行一行看!!! 不要不懂装懂!!!