說到樹的層次遍歷,就應該提到廣度優先搜索算法------廣度優先搜索算法(Breadth-First-Search),又譯作寬度優先搜索,或橫向優先搜索,簡稱BFS,是一種圖形搜索算法。
可以說樹層次遍歷是廣度優先遍歷的一種直接應用吧,比較廣度優先搜索是圖形的一種搜索算法,圖形是一種比較大的概念,但這個和深度優先齊名的算法,在樹的層次遍歷引用中,並沒有那么復雜,或許是因為用在樹的遍歷,而非圖吧。
樹的層次遍歷,故名思議,在一棵樹中,把節點從左往右,一層一層的,從上往下,遍歷輸出,這里要用到一種很重要的數據結構,隊列。
步驟如下:
1.首先將根節點放入隊列中。
2.當隊列為非空時,循環執行步驟3到步驟5,否則執行6;
3.出隊列取得一個結點,訪問該結點;
4.若該結點的左子樹為非空,則將該結點的左子樹入隊列;
5.若該結點的右子樹為非空,則將該結點的右子樹入隊列;
6.結束。
import java.util.ArrayDeque; class TreeNode { private TreeNode left = null; private TreeNode right = null; Integer val; public TreeNode(Integer val) { this.val = val; } public void setLeft(TreeNode node) { this.left = node; } public void setRight(TreeNode node) { this.right = node; } public static void BFSOrder(TreeNode node) { if (node == null) { return; } ArrayDeque<TreeNode> queue = new ArrayDeque<>(); queue.add(node); while (!queue.isEmpty()) { // 一定要放判定之前,否則會出大事 node = queue.poll(); System.out.print(node.val + " "); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } // System.out.println(queue.poll().val + " "); } } } public class Solution { public static void main(String[] args) { TreeNode n1 = new TreeNode(1); TreeNode n2 = new TreeNode(2); TreeNode n3 = new TreeNode(3); TreeNode n4 = new TreeNode(4); TreeNode n5 = new TreeNode(5); TreeNode n6 = new TreeNode(6); TreeNode n7 = new TreeNode(7); n1.setLeft(n2); n1.setRight(n3); n2.setLeft(n4); n2.setRight(n5); n3.setLeft(n6); n4.setLeft(n7); TreeNode.BFSOrder(n1); } }