• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
li-keke
博客园    首页    新随笔    联系   管理    订阅  订阅
代码随想录算法训练营第十五天| 二叉树的层序遍历

二叉树的层序遍历:https://leetcode.cn/problems/binary-tree-level-order-traversal/

层序遍历使用队列实现:用size记录当前层的个数,size--控制弹出元素的个数,保证当前层的元素都弹出后,再去遍历弹出下一层的元素。

public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayList<List<Integer>> res = new ArrayList<>();
        if (root == null){
            return res;
        }
        //借助队列
        LinkedList<TreeNode> treeNodes = new LinkedList<>();
        treeNodes.offer(root);
        while (!treeNodes.isEmpty()){
            ArrayList<Integer> list = new ArrayList<>();
            int size = treeNodes.size();
            while (size-- > 0){//不能使用treeNodes.size()--,因为treeNodes.size()是不断变化的
                TreeNode pop = treeNodes.pop();
                list.add(pop.val);
                if (pop.left != null){
                    treeNodes.offer(pop.left);
                }
                if (pop.right != null) {
                    treeNodes.offer(pop.right);
                }
            }
            res.add(list);
        }
        return res;
    }

226.反转二叉树:https://leetcode.cn/problems/invert-binary-tree/

广度优先搜索BFS:遍历每一层的时候翻转二叉树

深度优先搜索DFS:

指针交换、而不是只是交换值。前序和后序最直接,中序遍历会将没棵子树的根节点遍历两遍。

递归遍历需要再理解理解。

class Solution{
    //DFS、递归
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        //后序遍历
        invertTree(root.left);
        invertTree(root.right);
        reverseNode(root);

        return root;
    }
    private void reverseNode(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}

 101.对称二叉树:https://leetcode.cn/problems/symmetric-tree/

需要注意的点:

  1. 外侧结点相比较,内侧结点相比较;
  2. 判断根节点的左子树是否能翻转成右子树;
  3. 只能使用后序遍历,后序遍历才可以将一个子树的左右孩子的信息返回给根节点。

 

什么类型的题使用后序遍历?需要处理孩子的信息,向上一层返回

public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    private boolean compare(TreeNode left, TreeNode right) {
        //终止条件
        if (left == null && right == null) {
            return true;
        } else if (left == null && right != null) {
            return false;
        } else if (left != null && right == null) {
            return false;
        } else if (left.val != right.val) {
            return false;
        }
        //可以继续执行的逻辑
        boolean compareOutside = compare(left.left, right.right);  //外侧:左孩子的左孩子和右孩子的右孩子比较
        boolean compareInside = compare(left.right, right.left);  //内侧:左孩子的右孩子和右孩子的左孩子比较
        return compareOutside && compareInside;
    }

 

posted on 2022-11-13 23:50  李晓喵  阅读(30)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3