备战实习记录之【树与二叉树篇】3——二叉树的层序遍历

3 二叉树的层序遍历

 3.1 102. 二叉树的层序遍历

3.2 107. 二叉树的层序遍历 II

3.3 199. 二叉树的右视图

3.4 637. 二叉树的层平均值

3.5 429. N 叉树的层序遍历


3 二叉树的层序遍历

 3.1 102. 二叉树的层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。

需要借用一个辅助数据结构即队列来实现,「队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。」

「而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。」

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root!=null) queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> tmp = new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left!=null){queue.offer(node.left);}
                if(node.right!=null){queue.offer(node.right);}
            }
            res.add(tmp);
        }
        return res;
    }
}

3.2 107. 二叉树的层序遍历 II

与层序遍历相比,我们只需把层序遍历得到的结果(List集合)反转一下,即可得到二叉树自底向上的层序遍历。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root!=null) queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> tmp = new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
            res.add(tmp);
        }
        Collections.reverse(res);
        return res;
    }
}

3.3 199. 二叉树的右视图

仅需在层序遍历的基础上,判断当前下标i是否是这一层的最右边元素(i==size-1)。

如果是最右边元素,加入结果集合。

遍历结束返回结果集合即可。

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<Integer> res = new ArrayList<>();
        if(root!=null) queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                if(i==size-1){res.add(node.val);}
                if(node.left!=null){queue.offer(node.left);}
                if(node.right!=null){queue.offer(node.right);}
            }
        }
        return res;
    }
}

3.4 637. 二叉树的层平均值

仅需在层序遍历的基础上,对每一层的元素做累加和,并判断当前下标i是否是这一层的最右边元素(i==size-1)。

如果是最右边元素,则计算一次平均值。加入结果集合。

遍历结束返回结果集合即可。

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<Double> res = new ArrayList<>();
        if(root!=null) queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            double sum = 0;   
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                if(node!=null) sum+=node.val;
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
                if(i==size-1){
                    res.add(sum/size);
                }
            }
        }
        return res;
    }
}

3.5 429. N 叉树的层序遍历

仅需在层序遍历的基础上,将对左右子树的判断改为对当前节点的children的Node集合进行遍历,并将非空的子节点加入queue。

遍历结束返回结果集合即可。

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        Queue<Node> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root!=null) queue.offer(root);
        while(!queue.isEmpty()){
            List<Integer> tmp = new ArrayList<>();
            int size = queue.size();
            for(int i=0;i<size;i++){
                Node node = queue.poll();
                tmp.add(node.val);
                List<Node> childs = node.children;
                for(Node ch:childs ){
                    if(ch!=null) queue.offer(ch);
                }
            }
            res.add(tmp);
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/paranior/article/details/115283495