算法刷题Day14 - 二叉树Part2|226.翻转二叉树|101.对称二叉树|104.二叉树最大深度|111.二叉树最小深度

LeetCode - 226. Invert Binary Tree 翻转二叉树

解题思路这里的翻转二叉树翻转的不只是数值,而是改变左右指针的指向。二叉树的题目大多需要遍历,因此在做二叉树递归时一定要先判断前中后序哪一个适合遍历。以下代码是前序遍历(中左右)的思路

class Solution {
    public TreeNode invertTree(TreeNode root) {
        invert(root);
        return root;
    }
    public void invert(TreeNode root) {
        if (root == null) return;
        //swap(中)
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        invert(root.left);//左
        invert(root.right);//右
    }
}

LeetCode - 101. Symmetric Tree 翻转二叉树

解题目标:给定一个二叉树,判断是否是一个对称二叉树

解题思路:这道题刚开始自己写的时候思路有错,不能单纯地判断左右子树是否相等,而是相互翻转的关系。问题的关键点也就是左子树翻转后是否等于右子树。在二叉树的题目中确定遍历顺序是很关键的。这道题就只能使用后序遍历(左右中),因为当前节点是否翻转与另一边的节点相等需要率先判断左右子节点给到的信息才能得出结果。 注意在单次迭代的时候左节点的左子节点相比较的是应该是右节点的右子节点(外侧节点),内侧节点也是同理。左子树比较顺序是左右中,右子树的比较顺序是右左中,最后判断一定是左右都处理完后才判断中节点。

class Solution {
    public boolean isSymmetric(TreeNode root) {
         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 outsideNodes = compare(left.left, right.right); // 左子树:左, 右子树:右
        boolean insideNodes = compare(left.right, right.left); // 左子树:右, 右子树:左
        return outsideNodes && insideNodes; // 中
    }
}

LeetCode - 104. 二叉树最大深度

解题思路:想要找到最大深度,实际上可以转化为求二叉树的高度,应该从叶子节点从下至上给父节点传递信息,所以应该采用后序遍历(左右中),因为在每一层都要先判断左右子节点的最大高度。

class Solution {
    public int maxDepth(TreeNode root) {
        return getHight(root);
    }

    public int getHight(TreeNode root) {
        if (root == null) return 0;
        //left hight
        int leftHight = getHight(root.left); // 左
        int rightHight = getHight(root.right); // 右
        int hight = Math.max(leftHight, rightHight) + 1;// 中
        return hight;
    }
}

了解了后序遍历,其实可以简化代码:

class Solution {
    public int maxDepth(TreeNode root) {
        return getHight(root);
    }

    public int getHight(TreeNode root) {
        if (root == null) return 0;
        return Math.max(getHight(root.left), getHight(root.right)) + 1;
    }
}

LeetCode - 111. 二叉树最小深度

解题思路:求最小深度和求最大深度还是不太一样,最小深度的定义是根节点到最近的叶子节点的距离,因此不能直接把上一题的max()换成min(),否则会包括了根节点压根没有左/右子树最后得出最小深度为1的情况。这题依然是后序遍历,但是左/右子树为空的情况需要分别考虑。

class Solution {
    public int minDepth(TreeNode root) {
        return getMinDepth(root);
    }

    public int getMinDepth(TreeNode root) {
        if (root == null) return 0;
        int leftDepth = getMinDepth(root.left);
        int rightDepth = getMinDepth(root.right);
        if (root.left == null && root.right != null) {
            return rightDepth + 1;
        }
        else if (root.left != null && root.right == null) {
            return leftDepth + 1;
        } else {
            return Math.min(leftDepth, rightDepth) + 1;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值