1. 程式人生 > 實用技巧 >leetcode-二叉樹的層序遍歷

leetcode-二叉樹的層序遍歷

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/submissions/

關於二叉樹的層序遍歷,其節點讀取順序為 按層遍歷從左到右的順序進行讀取;

但根據二叉樹的特徵可以瞭解到對於節點之間只有具體父子關係,並沒有層級關係能直接體現;

root -> root.left; root -> root.right; 可以看到父節點和左右兩個子節點的關聯關係;

因此為了同一層級 兄弟節點的關係, 需要藉助於每一層級上一層的節點順序來維護下一層級的節點順序;

這裡的思路為 藉助佇列 先進先出 的特性以及 節點之間父子關係實現層序遍歷;

通過維護一個Queue(這裡可以藉助java linkedList來實現),藉助queue 入隊(offer) 出隊(poll) 的特性來實現層次性的將資料進行入隊操作;

在展示資料時,當需要按層次進行資料展示,此時我們就需要特殊的處理方式;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class
Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if(root == null){ return result; } // 藉助連結串列來實現佇列操作 Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root);
while(!queue.isEmpty()){ // 獲取當前佇列中的已存在元素數量 Integer size = queue.size(); // 對於當前存在於佇列中的元素是屬於同一層的元素 // 因此首先需要將當前層的元素都寫入到同一個list中 List<Integer> sameLevelData = new ArrayList<>(size); for(int i = 0;i < size;i++){ TreeNode treeNode = queue.poll(); // 將資料寫入到集合中 sameLevelData.add(treeNode.val); // 並將當前節點 按照層序遍歷的需求將當前節點的左右子節點(非空)寫入到佇列中 TreeNode leftNode = treeNode.left; if(leftNode != null){ queue.offer(leftNode); } TreeNode rightNode = treeNode.right; if(rightNode != null){ queue.offer(rightNode); } } // 當迴圈結束後表示已經獲取完成一個層級的資料 result.add(sameLevelData); } return result; } }

關於二叉樹層序遍歷流程圖