leetcode 二叉树层序遍历

2021-04-05  本文已影响0人  FrankXu0808
题目
/**
 * 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<>();
        if(root==null) return res;
        List<TreeNode> level = new LinkedList<TreeNode>();
        level.add(root);
        List<Integer> treeval = new ArrayList<>();
        treeval.add(root.val);
        res.add(treeval);
        while(!level.isEmpty()){            
            treeval = new ArrayList<>();
            int size=level.size();
            while(size>0){
                TreeNode temp = level.get(0);
                //System.out.println(temp.val);
                if(temp.left!=null){
                    //System.out.println(temp.left.val);
                    treeval.add(temp.left.val);
                    level.add(temp.left);
                } 
                if(temp.right!=null){
                    //System.out.println(temp.right.val);
                    treeval.add(temp.right.val);
                    level.add(temp.right);
                }                 
                level.remove(0);
                size=size-1;
            }     
            if(treeval.size()>0) res.add(treeval);
        }
        return res;
    }
}

这道题有两个点需要注意,一个是我将保存每层所有结点的level变量从ArrayList改成了LinkedList,这样对于level.remove(0)操作来说,每次移除第一个元素的话,链表结构的操作复杂度比数组结构要小得多。
第二个点是在每次循环中,我一开始都将treeval在原数组上清空,导致最终的res为空,原因是res.add(treeval)时,类似于浅拷贝,res里面只存放了res的引用,所有每次在res原数组上清空,res所包含的treeval都是空的。

上一篇 下一篇

猜你喜欢

热点阅读