二叉樹的遍歷之廣度優先遍歷
阿新 • • 發佈:2019-02-04
package com.yc.test; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; import com.yc.tree.ThreeLinkBinTree; import com.yc.tree.ThreeLinkBinTree.Node; public class BFS { /** * 此時二叉樹的情況為: * A * │ │ * + ←┘ └→ B * │ │ * * ←┘ └→ D * │ │ * / ←┘ └→ % * │ │ * E ←┘ └→ F * */ @SuppressWarnings({ "rawtypes", "unused", "unchecked" }) public static void main(String[] args) { ThreeLinkBinTree<String> tree = new ThreeLinkBinTree<String>("A"); Node n2_l = tree.addAndReturn(tree.root(), "+", true); Node n2_r = tree.addAndReturn(tree.root(), "B", false); Node n3_n2_l = tree.addAndReturn(n2_l, "*", true); Node n3_n2_r = tree.addAndReturn(n2_l, "D", false); Node n4_n3_n2_l = tree.addAndReturn(n3_n2_l, "/", true); Node n4_n3_n2_r = tree.addAndReturn(n3_n2_l, "%", false); Node n5_n4_n3_n2_l = tree.addAndReturn(n4_n3_n2_r, "E", true); Node n5_n4_n3_n2_r = tree.addAndReturn(n4_n3_n2_r, "F", false); System.out.println( "廣度優先遍歷結果為:" + brFirSear(tree) ); } public static <E> List<Node> brFirSear(ThreeLinkBinTree<E> tree){ return brFirSear(tree.root()); } private static <E> List<Node> brFirSear(ThreeLinkBinTree<E>.Node root) { List<Node> nodes = new ArrayList<Node>(); Deque<Node> deque = new ArrayDeque<Node>(); deque.offer(root); while( !deque.isEmpty()){ Node tempN = deque.poll(); nodes.add(tempN); if(tempN.getLeft() != null){ deque.offer(tempN.getLeft()); } if(tempN.getRight() != null){ deque.offer(tempN.getRight()); } } return nodes; } }
測試結果為:
廣度優先遍歷結果為:[A, +, B, *, D, /, %, E, F]