DAY15|二叉树的层序遍历,226.翻转二叉树,101.对称二叉树

二叉树的层序遍历

文字讲解二叉树的层序遍历

视频讲解二叉树的层序遍历

状态:看了文字讲解后理解了,熟悉队列来遍历每层子节点的代码编写方式,理解广度优先遍历的思想; 代码的结构和迭代法遍历法的前序遍历非常相似;

思路:

1、层序遍历时,主要是掌握如何通过队列将每一层的节点加入到队列中,而层序遍历的整体思想和代码,跟前一天中的通过栈实现前序后序遍历的代码非常相似,只不过遍历借助数据结构不同;
在这里插入图片描述

代码:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new LinkedList<>();
        if (root == null) return result;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            LinkedList<Integer> temp = new LinkedList<>();
            //每一层需要处理的节点数量,这一句非常重要;
            int len = queue.size();
            while (len > 0) {
                TreeNode poll = queue.poll();
                temp.add(poll.val);
                if (poll.left != null) {
                    queue.offer(poll.left);
                }
                if (poll.right != null) {
                    queue.offer(poll.right);
                }
                //poll完之后一定要--;
                len--;
            }
            result.add(temp);
        }
        return result;
    }
}

226.翻转二叉树(层序遍历的衍生题)

文字讲解反转二叉树

视频讲解代码随想录-反转二叉树

状态:这一题的解题思路主要是运用:层序遍历+左右节点翻转;

思路:

1、首先要明确,二叉树中的左右子树都调换位置就可以实现翻转二叉树了;

代码:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return root;
        }
        //采用广度优先遍历
        ArrayDeque<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int len = queue.size();
            while (len>0) {
                TreeNode poll = queue.poll();
                swapNode(poll);
                if (poll.left != null) {
                    queue.offer(poll.left);
                }
                if (poll.right != null) {
                    queue.offer(poll.right);
                }
                len--;
            }
        }
        return root;
    }

    public void swapNode(TreeNode node) {
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
    }
}

101.对称二叉树

文字讲解对称二叉树

视频讲解代码随想录-对称二叉树

状态:视频里讲的真好,推荐感兴趣看一下视频,可以帮助二叉树各遍历方式作用和理解递归的本质;

思路:

1、看视频讲解,看视频讲解,看视频讲解;此题可以帮助理解递归进行二叉树后序遍历的意义;

代码:

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

    //递归判断两个树是否可以相互翻转,即判断是否对称
    public boolean isReverseTree(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 != null) {
            return false;
        }
        if (node1 != null && node2 == null) {
            return false;
        }
        if (node1 == null && node2 == null) {
            return true;
        }
        if (node1 != null && node2 != null && node1.val != node2.val) {
            return false;
        }
        //判断两个子树的外侧是否相同
        boolean outFlag = isReverseTree(node1.left, node2.right);
        //判断两个子树的内侧是否相同
        boolean inFlag = isReverseTree(node1.right, node2.left);
        //两个子树的内外侧都相同,这两个子树可翻转即对称
        return outFlag && inFlag;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@晴天_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值