代码随想录算法训练营第14天| 226.翻转二叉树, 101. 对称二叉树, 104.二叉树的最大深度, 111.二叉树的最小深度

学习任务:


Leetcode226.翻转二叉树

难度:简单 | 相关标签:树、深度优先搜索、广度优先搜索、二叉树

  • 题目: 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

  • 思路: 遍历的同时做反转操作,靠指针来遍历

  • 注意:

  • 代码:
    深度优先遍历中的前序遍历,递归法

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

    //交换左右子树
    private void swapChildren(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}
  • 反思:

Leetcode101. 对称二叉树

难度:简单 | 相关标签:树、深度优先搜索、广度优先搜索、二叉树

  • 题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。

  • 思路: 左子树和右子树可以相互反转,就是对称二叉树

  • 注意:

    • 只能使用后序遍历,收集孩子的信息需要向上反馈
    • 需要借助画图来思考左右子树的比较
  • 代码:

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

    // 比较左右子树是否可以相互反转
    public boolean compare(TreeNode left, TreeNode right){
        if (left == null && right != null){
            return false;
        } else if(left != null && right == null){
             return false;
        } else if (left == null && right == null){
            return true;
        } else if (left.val != right.val){
            return false;
        }  
         // 比较外侧
        boolean compareOutside = compare(left.left, right.right);
        // 比较内侧
        boolean compareInside = compare(left.right, right.left);
        boolean isSame = compareOutside && compareInside;
        return isSame;
    }
}
  • 反思:

Leetcode104.二叉树的最大深度

难度:简单 | 相关标签:树、深度优先搜索、广度优先搜索、二叉树

  • 题目: 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

  • 思路: 根节点的高度,就是二叉树的最大深度,所以本题可以用前序遍历也可以用后序遍历

  • 注意:

    • 什么是深度?从根节点到最远叶子节点的最长路径上的节点数
    • 什么是高度?二叉树中任意一个结点到叶子节点的距离
    • 求深度用前序遍历,求高度用后序遍历
  • 代码:
    先求高度,间接求最大深度,这里使用的是后序遍历

class Solution {
    public int maxDepth(TreeNode root) {
        // 根节点的高度,就是二叉树的最大深度
        return height(root);

    }
    // 求二叉树的高度
    public int height(TreeNode node){
        if(node == null){
            return 0;
        }
        int leftheight = height(node.left);
        int rightheight = height(node.right);
        int h = 1 + Math.max(leftheight, rightheight);
        return h;
    }
}
  • 反思:

Leetcode111.二叉树的最小深度

难度:简单 | 相关标签:树、深度优先搜索、广度优先搜索、二叉树

  • 题目: 给定一个二叉树,找出其最小深度。
    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
    说明:叶子节点是指没有子节点的节点。

  • 思路: 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。

  • 注意:

  • 代码:

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = minDepth(root.left);
        int rightDepth = minDepth(root.right);
        int h = Math.min(leftDepth, rightDepth) + 1;
        if (root.left == null) {
            return rightDepth + 1;
        }
        if (root.right == null) {
            return leftDepth + 1;
        }
        // 左右结点都不为null
        return h;
    }
}
  • 反思:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值