二叉树的层序遍历序列存储--层级BFS

0x01.问题

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:
[3,9,20,null,null,15,7],

3   
 / \ 
   9 
    20
   /  \   
   15   7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]


 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }

public List<List<Integer>> levelOrder(TreeNode root)

0x02.简要分析

  • 我们知道,如果要直接输出二叉树的中序遍历的话,很容易,只需要使用队列,第一次存入根节点,之后在每次输出对头元素之后,再继续把左右孩子节点入队。

  • 其实把这个中序序列存入一个集合中,大体方法还是一样的,不过对于层级的划分,需要额外的考虑了,因为是二级集合,所以要确定每一层存入的是哪些节点。

    • 最为容易想到的办法,是维护一个状态(TreeNode,level),表示每个节点的层级,子树层级加1,最后根据层级再重新进行存储。但是,这需要消耗更多额外的空间,也没有更好的办法呢?
    • 我们知道,BFS在遍历的时候,是把左右孩子都存入队列中,那么在一层中存入的左右孩子,层级应该是相同的,也就是说,如果我们每次在BFS的时候,每次遍历完一层,就可以清楚的把层级相同的分个一个集合中,完成了最终的目的。
  • 详细算法:

    • (1)构造二级集合,如果root为空,直接返回。否则创建队列,并将根节点存入队列。
    • (2)当队列不为空时,取出当前队列的长度currSize,遍历所有这一层的节点,并在遍历的时候完成节点的存储,左右孩子的入队。

0x03.解决代码–BFS

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null){
            return ans;
        }
        Deque<TreeNode> q=new ArrayDeque<>();
        q.addLast(root);
        while(!q.isEmpty()){
            int currSize=q.size();
            List<Integer> f=new ArrayList<>();
            for(int i=1;i<=currSize;i++){
                TreeNode curr=q.removeFirst();
                f.add(curr.val);
                if(curr.left!=null){
                    q.addLast(curr.left);
                }
                if(curr.right!=null){
                    q.addLast(curr.right);
                }
            }
            ans.add(f);
        }
        return ans;
    }
}

ATFWUS --Writing By 2020–05-13

原创文章 248 获赞 288 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/106089743
今日推荐