二叉树的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, 一行一行看!!! 不要不懂装懂!!!