算法修炼Day15|226.翻转二叉树 101.对称二叉树

59 阅读2分钟

LeetCode:层序遍历  10

102. 二叉树的层序遍历 - 力扣(LeetCode)

1.思路

结果导向:每一层一个数组,结果集为多层的结果,也就是数组为单位的结果集,故采用链表存储

2.代码实现

class Solution {
    public List<List<Integer>> resList = new ArrayList<>(); // 存放结果数组的链表,作为结果集

    public List<List<Integer>> levelOrder(TreeNode root) {
        
        checkFun(root); // 调用函数checFun()
        return resList;
    }
    public void checkFun(TreeNode node) {
        if (node == null) return;
        Queue<TreeNode> que = new LinkedList<>(); // 队列存放节点,打辅助
        que.offer(node);

        while (!que.isEmpty()) { // 只要队列不为null,循环遍历,当为null时,二叉树也遍历完了
            List<Integer> list = new ArrayList<>(); // 每层循环创建一个链表list,装入本层结果
            int len = que.size(); // 获取本层加入节点数

            // 对本层进行循环遍历
            while (len > 0) {
                TreeNode tmp = que.poll(); // 临时节点存储队列门口的节点
                list.add(tmp.val); // 加入结果集中
                if (tmp.left != null) que.offer(tmp.left); // 下一层:左节点不为null时加入队列
                if (tmp.right != null) que.offer(tmp.right); // 下一层:右节点不为null时加入队列
                len--; // 当前层在队列中数值减1
            }
            resList.add(list); //一层循环结束表明一层结束,将该层结果加入结果集中
        }
    }
}
// 递归 不太好理解
class Solution {
    public List<List<Integer>> resList = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun(root, 0);
        return resList;
    }
    public void checkFun(TreeNode node, Integer deep) {
        if (node == null) return;
        deep++;

        if (resList.size() < deep) {
            List<Integer> list = new ArrayList<>();
            resList.add(list);
        }
        resList.get(deep - 1).add(node.val);
        checkFun(node.left, deep);
        checkFun(node.right,deep);
    }
}

LeetCode:226.翻转二叉树 

226. 翻转二叉树 - 力扣(LeetCode)

1.思路

从叶子节点开始反转,后序遍历(左右中)即可,

2.代码实现
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        invertTree(root.left);
        invertTree(root.right);
        swapChildren(root);
        return root;
    }

    private void swapChildren(TreeNode root) {
        TreeNode tmpNode = root.left;
        root.left = root.right;
        root.right = tmpNode;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).

LeetCode:101.对称二叉树 

101. 对称二叉树 - 力扣(LeetCode)

1.思路

后序遍历,保证左右节点均遍历过,保存了根节点左右子树是否对称的信息,才能对树的对称性进行判断。 另外一种思路,中序遍历输出结果到数组,对数组进行双指针遍历判断即可。

2.代码实现
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;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).