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

刷题神器

代码随想录

往期回顾

>【二叉树】|代码随想录算法训练营第11天|二叉树递归遍历、二叉树迭代遍历、二叉树层序遍历

题目

226.翻转二叉树

题目:题目链接
文章:文章讲解
视频:视频讲解

  • 学后思路

    翻转二叉树,就是逐级进行左右节点进行交换,可以用前序和后续遍历,不能使用中序遍历,中序遍历会导致已经交换的节点重新换回原来的位置

解法:

// 递归
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null)
            return root;
        swap(root);
        invertTree(root.left);
        invertTree(root.right);

        return root;

    }

    public void swap(TreeNode treeNode) {
        TreeNode temp = treeNode.left;
        treeNode.left = treeNode.right;
        treeNode.right = temp;
    }
}

//层序遍历
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null)
            return root;
        Stack<TreeNode> stack = new Stack();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            swap(node);
            if (node.right != null) {
                stack.push(node.right);
            }
            if (node.left != null) {
                stack.push(node.left);
            }
        }

        return root;

    }

    public void swap(TreeNode treeNode) {
        TreeNode temp = treeNode.left;
        treeNode.left = treeNode.right;
        treeNode.right = temp;
    }
}
  • 题目总结
    • 注意选择遍历的顺序,选择前序和后续较为方便,选择中序的话,需要遍历两次左子树

101. 对称二叉树

题目:题目链接

文章:文章讲解
视频:视频讲解

  • 学后思路
    对称二叉树,使用后序遍历进行处理,先处理左右子树,然后左右子树的结果决定父节点

解法一:

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

    public 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 out = compare(left.left, right.right);
        boolean in = compare(left.right, right.left);

        return out && in;
    }
}
  • 题目总结
    • 注意判断条件,注意判断的顺序

104.二叉树的最大深度

题目:题目链接
文章:文章讲解
视频:视频讲解

  • 学后思路
    高度用后续,从下之上,深度用前序 从上至下

解法一:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null)
            return 0;
        int leftH = maxDepth(root.left);
        int rightH = maxDepth(root.right);
        return 1 + Math.max(leftH, rightH);
    }
}

题目总结

  • 后续遍历

111.二叉树的最小深度

题目:题目链接
文章:文章讲解
视频:视频讲解

  • 学后思路
    和最大深度思路类似,注意深度的意思是到叶子节点的最小距离
class Solution {
    public int minDepth(TreeNode root) {
        if (root == null)
            return 0;
        // 左
        int minLeft = minDepth(root.left);
        // 右
        int minRight = minDepth(root.right);
        // 中
        if (root.left == null && root.right != null) {
            return 1 + minRight;
        } else if (root.left != null && root.right == null) {
            return 1 + minLeft;
        } else {
            return 1 + Math.min(minLeft, minRight);
        }
    }
}

题目总结

  • 使用后续遍历,注意中序遍历的时候要判断null的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值