LeetCode Day15 层序遍历

59 阅读1分钟

102. 二叉树的层序遍历

class Solution {
    public List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkLevelOrder(root, 0);
        return res;
    }

    public void checkLevelOrder(TreeNode node, Integer deep){
        if(node == null) return;
        deep ++;

        if(res.size() < deep){
            List<Integer> item = new ArrayList<Integer>();
            res.add(item);
        }
        //因为是按层数遍历,数的第一层就相当于存储在res数组下标为0的数组中所以要deep-1
        res.get(deep - 1).add(node.val);
        checkLevelOrder(node.left, deep);
        checkLevelOrder(node.right, deep);
    }
}

226. 翻转二叉树

这题需要注意的点:如果使用递归遍历而非迭代遍历的话,递归时需要注意,中序遍历是有可能会翻转两次的。 以前序遍历为例,假设我需要镜像翻转一棵二叉树,实际上是根节点不动,先交换它的左右子树,接着左右子树再各自交换自己的左右子树,反复循环至全部结点交换完成。后序遍历的思想逻辑是左右根,也是同样的道理,只不过后序遍历是先把左子树给交换完再去交换右子树。但如果用中序遍历的话有可能会出现翻转两次的情况。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return null;
        }
        invertTree(root.left);
        invertTree(root.right);
        swapChildren(root);
        return root;
    }

    public void swapChildren(TreeNode root){
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
}

101. 对称二叉树

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    private boolean compare(TreeNode left, TreeNode right){
        if(left == null && right != null){
            return false;
        }

        if(left != null && right == null){
            return false;
        }

        if(left == null && right == null){
            return true;
        }
        if(left.val != right.val){
            return false;
        }

        boolean compareOutside = compare(left.left, right.right);
        boolean compareInside = compare(left.right, right.left);
        return compareInside && compareOutside;
    }
}