說到樹的層次遍歷,就應該提到廣度優先搜索算法------廣度優先搜索算法(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);
}
}
