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; } }
关于二叉树层序遍历流程图

https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/submissions/
对于当前操作其和第一个层序遍历的不同点在于 其对于通过队列获取到的同一层级的数据 存储到集合中的方式不同;
由于其要求从最底下一层进行数据输出,因此对于能够满足先进后出特征的数据结构包含 栈 以及 链表(头插入)
/** * 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>> levelOrderBottom(TreeNode root) { List<List<Integer>> list = new LinkedList<>(); if(root == null){ return list; } // 对于当前要求实际还是层序遍历,只是对于层的关系需要进行反转存储 // 因此和之前直接使用数组集合顺序存储不同的点,对于当前存储时需要将后写入的数据存储到开始位置 // 为此为了满足当前要求(先进后出)使用链表(头插法)或栈是一个很好的选择 Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ int size = queue.size(); List<Integer> sameLevelData= new ArrayList<>(size); for(int i = 0;i < size;i++){ TreeNode treeNode = queue.poll(); sameLevelData.add(treeNode.val); TreeNode left = treeNode.left; if(left != null){ queue.offer(left); } TreeNode right = treeNode.right; if(right != null){ queue.offer(right); } } // 对于存入数据时要求插入头节点,该操作就可以保证 后写入的数据 在读取时优先读取 list.add(0,sameLevelData); } return list; } }

浙公网安备 33010602011771号