首页 > 编程语言 >代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2

代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2

时间:2023-01-29 13:22:39浏览次数:43  
标签:right return 层序 随想录 二叉树 TreeNode null root left

层序遍历

/**
 * 二叉树的层序遍历
 */
class QueueTraverse {
    /**
     * 存放一层一层的数据
     */
    public List<List<Integer>> resList = new ArrayList<>();

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

        traverse(root, resList);
        return resList;

    }

    /**
     *  树的孩子节点可能有不止两个
     */
    public void traverse(TreeNode node, List<List<Integer>> resList) {
        // 判空
        if (node == null) {
            return;
        }
        // 准备
        ArrayDeque<TreeNode> que = new ArrayDeque<>();
        TreeNode cur;
        // 循环开始
        que.offer(node);
        while (!que.isEmpty()) {
            //len获取到的是每层一开始的数据大小
            int len = que.size();
            //对每一层的分别建立一个list存放本层数据
            List<Integer> subList = new ArrayList(len);

            while (len > 0) {
                //取出本层节点并删除
                cur = que.poll();
                len--;
                // visit
                subList.add(cur.val);

                if (cur.left != null) {
                    que.offer(cur.left);
                }
                if (cur.right != null) {
                    que.offer(cur.right);
                }
            }
            //一层的数据遍历添加完毕 开始下一层
            resList.add(subList);
        }
    }

    /**
     * 单纯遍历所有元素
     */
    public void visit(TreeNode root) {
        ArrayDeque<TreeNode> queue = new ArrayDeque<>();
        TreeNode p = root,temp = null;
        queue.offer(p);
        while (!queue.isEmpty()) {
            // visit 节点
            temp = queue.poll();
            System.out.println(temp.val);
            if (p.left != null) {
                queue.offer(temp.left);
            }
            if (p.right != null) {
                queue.offer(temp.right);
            }
        }
    }
}

LeetCode 226.翻转二叉树

分析1.0

仔细看题,题目中的翻转二叉树是整个树一起翻转,不是只翻转节点的左右孩子

选择遍历顺序-中序遍历(左子树翻转(左子树成了右子树),根树翻转,右子树翻转)左子树翻转了两次

class Solution {
    public TreeNode invertTree(TreeNode root) {
        preOrder(root);
        return root;
    }

    public void preOrder(TreeNode root){
        if(root == null){
            return;
        }
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        preOrder(root.left);
        preOrder(root.right);
        return;
    }
}

LeetCode 101.对称二叉树 2 

失误 对称二叉树比较的是子树,不光是子节点

比较每个节点的左右子树是否相等,树又是由节点组成的,就是同步遍历根节点左右两颗子树,比较节点是否相等

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return false;
        }
        return visit(root.left, root.right);
    }

    public boolean visit(TreeNode node1, TreeNode node2){
        if(node1 == null && node2 != null){
            return false;
        }
        if(node2 == null && node1 != null){
            return false;
        }
        if(node1 == null && node2 == null){
            return true;
        }
        if(node1.val != node2.val){
            return false;
        }
        visit(node1.left,  node2.left);
        visit(node1.right, node2.right);
        return true;
    }
}

分析2.0

遍历子树并不是按照一样的逻辑顺序,左子树的左子树要和右子树的右子树相等 以此类推
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 compareOutside && compareInside;
    }
}

总结

  1. 树类题目注意区别孩子节点和子树
  2. 数组、字符串移除某个元素后,长度会发生变化,遍历中注意索引发生变化,树在遍历过程中的操作也会影响原本的遍历思路
  3. 不同的深度遍历顺序有不同的使用场景,注意具体问题具体分析
  4. 节点要非null才能进行操作 类似栈、队列非空才能操作一样

常用变量名增量更新

size、val、ans、cnt、cur、pre、next、left、right、index、gap、tar、res、src、len、start、end、flag、ch

 

标签:right,return,层序,随想录,二叉树,TreeNode,null,root,left
From: https://www.cnblogs.com/cupxu/p/17071677.html

相关文章

  • 代码随想录算法训练营day13
    基础知识二叉树基础知识二叉树多考察完全二叉树、满二叉树,可以分为链式存储和数组存储,父子兄弟访问方式也有所不同,遍历也分为了前中后序遍历和层次遍历Java定义public......
  • 257. 二叉树的所有路径
    问题描述https://leetcode.cn/problems/binary-tree-paths/description/解题思路叶子结点时,添加到结果序列即可。代码#Definitionforabinarytreenode.#class......
  • 226. 反转二叉树
    问题描述https://leetcode.cn/problems/invert-binary-tree/description/解题思路没啥好说的,python的交换简单极了。代码#Definitionforabinarytreenode.#cl......
  • 144. 二叉树的前序遍历
    问题描述https://leetcode.cn/problems/binary-tree-preorder-traversal/description/解题思路二叉树的先序遍历,没啥好说的。中-左-右。先序中序后序说的是中在哪里。......
  • 145. 二叉树的后序遍历
    问题描述https://leetcode.cn/problems/binary-tree-postorder-traversal/description/解题思路这个题和先序一样,没啥好说的。代码#Definitionforabinarytreen......
  • 翻转二叉树
    /***注意:left/right值若没有显示设置为null,值即为undefined*在调用二叉树前、中、后序遍历方法时,由于参数设置了默认值(tree)*所以进入了死循环*/consttree={......
  • 111. 二叉树的最小深度
    问题描述https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/解题思路这个题目不难,但对退出条件要求高。经过对题意的分析,我们对于root为None的......
  • 110. 平衡二叉树
    问题描述https://leetcode.cn/problems/balanced-binary-tree/description/解题思路这题一开始朴素的思路就是,对于每个节点,都计算其是不是平衡二叉树。计算平衡二叉树......
  • 104. 二叉树的最大深度
    问题描述https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/解题思路二叉树的最大深度,等于左子树的深度和右子树深度的较大值加1(即本层深度).代......
  • 101. 对称二叉树
    问题描述https://leetcode.cn/problems/symmetric-tree/description/解题思路这个题,一看就是递归。既然如此,我们按照递归的一般思路来看,即问题的定义即为问题的解。这......