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;
    }
}

 

posted @ 2020-12-26 19:27  郭星  阅读(191)  评论(0)    收藏  举报