二叉樹的深度優先和廣度優先遍歷
阿新 • • 發佈:2021-12-24
package com.springboot.study.tests.trees; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @Author: guodong * @Date: 2021/12/24 17:03 * @Version: 1.0 * @Description: */ @Data @AllArgsConstructor @NoArgsConstructor public class TreeNode { public int val;public TreeNode left; public TreeNode right; }
package com.springboot.study.tests.trees; import java.util.*; /** * @Author: guodong * @Date: 2021/12/24 17:05 * @Version: 1.0 * @Description: */ public class binaryTree { public static void main(String[] args) { List<Integer> list=newArrayList<Integer>(); //構造二叉樹 TreeNode treeNode6=new TreeNode(2,null,null); TreeNode treeNode5=new TreeNode(1,null,null); TreeNode treeNode4=new TreeNode(7,null,null); TreeNode treeNode3=new TreeNode(6,treeNode5,treeNode6); TreeNode treeNode2=new TreeNode(5,treeNode4,null); TreeNode root=new TreeNode(3,treeNode2,treeNode3); list=DFS(root); System.out.println("深度優先遍歷:"+list); list=BFS(root); System.out.println("廣度優先遍歷:"+list); } /** * 深度優先遍歷 * @param root * @return */ public static List<Integer> DFS(TreeNode root){ Stack<TreeNode> stack=new Stack<TreeNode>(); List<Integer> list=new ArrayList<Integer>(); if(root==null) return list; stack.push(root); while (!stack.isEmpty()){ TreeNode t=stack.pop(); if(t.right!=null){ stack.push(t.right); } if(t.left!=null){ stack.push(t.left); } list.add(t.val); } return list; } /** * 廣度優先遍歷 * @param root * @return */ public static List<Integer> BFS(TreeNode root){ Queue<TreeNode> queue=new LinkedList<TreeNode>(); List<Integer> list=new ArrayList<Integer>(); if(root==null){return list;} queue.add(root); while (!queue.isEmpty()){ TreeNode t=queue.remove(); if(t.left!=null){ queue.add(t.left); } if(t.right!=null){ queue.add(t.right); } list.add(t.val); } return list; } }
1. 圖的深度優先遍歷是指,從⼀個節點出發,⼀直沿著邊向下深⼊去找節點,如果找不到了則返回上⼀層找其他節點
2. 圖的⼴度優先遍歷只是,從⼀個節點出發,向下先把第⼀層的節點遍歷完,再去遍歷第⼆層的節點,直到遍歷到最後⼀層