Day15~102. 二叉树的层序遍历、 226.翻转二叉树、101. 对称二叉树

66 阅读1分钟

摘要

本文主要介绍了LeetCode二叉树的几个题目,包括102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树。

1、102. 二叉树的层序遍历

1.1 思路

  • 使用ArrayDeque,利用队列先进先出的特性
  • 外层while循环判断队列是否为空,控制遍历次数
  • 内层遍历队列,取出当前层的所有元素,如果当前节点的左右节点不为空,则加入到队列中
  • 重复上述步骤,直至循环结束队列为空

1.2 代码

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if(root == null) {
            return list;
        }
​
        ArrayDeque<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            List<Integer> data = new ArrayList<>();
            int size = queue.size();
            
            for(int i=0; i<size; i++) {
                TreeNode node = queue.pop();
                data.add(node.val);
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
            list.add(data);
        }
        return list;
    }

2、226.翻转二叉树

2.1 思路

  • 递归遍历,反转并重新设置当前节点的左右子树
  • 如果当前节点为空,返回null
  • 如果当前节点不为空,反转左子树和右子树,设置left为右子树,right为左子树

2.2 代码

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

3、101. 对称二叉树

3.1 思路

  • 递归遍历,首先比较左子树是否与右子树相等
  • 然后比较左节点的left与右节点的right是否相等,比较左节点的right与右节点的left是否相等

3.2 代码

    public boolean isSymmetric(TreeNode root) {
        return isSymmetric(root.left, root.right);
    }
​
    public boolean isSymmetric(TreeNode left, TreeNode right) {
        if(left == null && right == null) {
            return true;
        }
​
        if((left != null && right == null) || (left == null && right != null)) {
            return false;
        }
​
        if(left.val != right.val) {
            return false;
        }
​
        return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
    }

参考资料

代码随想录-二叉树层序遍历

代码随想录-翻转二叉树

代码随想录-对称二叉树