劍指Offer 把二叉樹列印多行
阿新 • • 發佈:2021-01-09
技術標籤:劍指
import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** * 把二叉樹列印多行 * * 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 * * 示例: * 輸入:{8,6,10,5,7,9,11} * 輸出:[[8],[6,10],[5,7,9,11]] * */ public class JZ060PrintMultipleLinesOfBinaryTree { /** * 1、初始化一個佇列,初始元素為root * 2、遍歷元素,每次首先獲取當前佇列的節點個數,即當前佇列的size * 3、彈出size次元素,則本次遍歷到的均為本層的元素 * 4、每次彈出元素的同時,把元素的左右孩子加入佇列,以便下次遍歷 * @param pRoot * @return */ ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) { return lists; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(pRoot); // 當前處理的元素 TreeNode curNode; while (!queue.isEmpty()) { int size = queue.size(); // 當前層的節點值,按照應該列印的順序新增到列表中 ArrayList<Integer> curList = new ArrayList<>(); for (int i = 0; i < size; i++) { curNode = queue.poll(); curList.add(curNode.val); if (curNode.left != null) { queue.offer(curNode.left); } if (curNode.right != null) { queue.offer(curNode.right); } } lists.add(curList); } return lists; } /** * 1、每行資料加入佇列,記錄當前行的節點數,和下一行的節點數 * 2、當前行列印完畢後,更新當前行節點數為下一行節點數量,換行,元素加入列表。 * @param pRoot * @return */ public static ArrayList<ArrayList<Integer>> Print2 (TreeNode pRoot) { ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) { return lists; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(pRoot); TreeNode curNode; int curCount = queue.size(); int nextCount = 0; ArrayList<Integer> cache = new ArrayList<>(); while (!queue.isEmpty()) { curNode = queue.poll(); curCount--; cache.add(curNode.val); if (curNode.left != null) { queue.offer(curNode.left); nextCount++; } if (curNode.right != null) { queue.offer(curNode.right); nextCount++; } if (curCount == 0) { curCount = nextCount; nextCount = 0; // lists.add(cache) 這個是錯誤的 lists.add(new ArrayList<>(cache)); cache.clear(); } } return lists; } public static void main(String[] args) { // {8,6,10,5,7,9,11} TreeNode root = new TreeNode(8); TreeNode rootLeft = new TreeNode(6); root.left = rootLeft; TreeNode rootRight = new TreeNode(10); root.right = rootRight; ArrayList<ArrayList<Integer>> lists = Print2(root); for (int i = 0; i < lists.size(); i++) { ArrayList<Integer> list = lists.get(i); for (int j = 0; j < list.size(); j++) { System.out.print(list.get(j)); } System.out.print(" "); } } }