零基础代码随想录【Day15】|| 层序遍历 ,226.翻转二叉树,101. 对称二叉树

目录

DAY15

层序遍历 

102.二叉树的层序遍历

解题思路&代码

226.翻转二叉树 (优先掌握递归) 

解题思路&代码

101. 对称二叉树 (优先掌握递归)  

解题思路&代码


DAY15

层序遍历 

看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。

题目链接/文章讲解/视频讲解:代码随想录

102.二叉树的层序遍历

力扣题目链接(opens new window)

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

解题思路&代码

思路:

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现。

队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

class Solution {
    //使用一个二维数组存储结果
    public List <List<Integer>> resList = new ArrayList<List<Integer>> ();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun02(root);
        return resList;

    }

    public void checkFun02(TreeNode node) {
        //判断二叉树是否为null
        if(node == null) return;
        //使用链表创建队伍,队伍就是一种链表
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(node);
        while( !que.isEmpty()) {
            List<Integer> itemList = new ArrayList<Integer>();
            //每一层遍历完后重新赋值size,从而有序遍历这一层
            int len = que.size();
            while (len > 0) {
                TreeNode tempNode = que.poll();
                //记录一层的数组
                itemList.add(tempNode.val);
                //将弹出tempNode的下一层节点引入
                if(tempNode.left != null) que.offer(tempNode.left);
                if(tempNode.right != null) que.offer(tempNode.right);
                len--;
            }
            //每遍历完一层,把结果存入二维数组中
            resList.add(itemList);
        }


    }
}

226.翻转二叉树 (优先掌握递归) 

力扣题目链接(opens new window)

翻转一棵二叉树。

226.翻转二叉树

这道题目一些做过的同学 理解的也不够深入,建议大家先看我的视频讲解,无论做过没做过,都会有很大收获。

题目链接/文章讲解/视频讲解:代码随想录

解题思路&代码

思路:画图是最好理解,理清思路的方式,明确自己用的是哪一种遍历方式

遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。

注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果

这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了

class Solution {
    public TreeNode invertTree(TreeNode root) {
        //终止条件就是节点没有left,right了,不然就一直左右互换
        if( root == null) {
            return null;
        }
        invertTree(root.left);
        invertTree(root.right);
        swapChildern(root);
        //返回的root,是一个包含left,right的二叉树节点
        return root;
    }
    //单独写了一个左右互换的函数
    private void swapChildern(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }

101. 对称二叉树 (优先掌握递归)  

给定一个二叉树,检查它是否是镜像对称的。

101. 对称二叉树

先看视频讲解,会更容易一些。 

题目链接/文章讲解/视频讲解:代码随想录

解题思路&代码

思路:如果要先判断子节点是否符合再判断根节点情况,一般都用后序遍历!!!

本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。

正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

    public boolean isSymmetric1(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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值