力扣深度优先搜索练习题(对称二叉树、平衡二叉树)

102 阅读1分钟

对称二叉树

来源:力扣(LeetCode) 链接:leetcode.cn/problems/sy…

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

示例 1:

图片.png

输入:root = [1,2,2,3,4,4,3]

输出:true

示例 2:

图片.png

输入:root = [1,2,2,null,3,null,3]

输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return isMirror(root.left, root.right);
    }
    
    private boolean isMirror(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) {
            return true;
        }
        if (node1 == null || node2 == null || node1.val != node2.val) {
            return false;
        }
        return isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
    }
}

思路分析

  1. 首先,如果根节点为空,则认为是对称的,直接返回true。

  2. 然后,我们定义一个辅助函数isMirror,用来判断两个节点是否镜像对称。它的递归终止条件有三种情况:

  • 两个节点都为空,返回true;
  • 两个节点其中一个为空,另一个不为空,返回false;
  • 两个节点的值不相等,返回false。
  1. 接下来,我们需要递归地判断左右子树是否镜像对称,即判断node1的左子树和node2的右子树是否镜像对称,以及node1的右子树和node2的左子树是否镜像对称。如果这两个条件都满足,说明整个树是镜像对称的。

平衡二叉树

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ba…

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

图片.png

输入:root = [3,9,20,null,null,15,7]

输出:true

示例 2:

图片.png

输入:root = [1,2,2,3,3,null,null,4,4]

输出:false

示例 3:

输入:root = []

输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -104 <= Node.val <= 104

代码

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        return height(root) != -1;
    }
    
    private int height(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int leftHeight = height(node.left);
        if (leftHeight == -1) {
            return -1;
        }
        int rightHeight = height(node.right);
        if (rightHeight == -1) {
            return -1;
        }
        if (Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        }
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

思路分析

  1. 首先,定义一个辅助函数height,用来计算二叉树的高度。如果当前节点为空,说明它的高度为0。然后递归计算左右子树的高度,并比较它们的高度差,如果超过1,则返回-1,表示当前二叉树不是平衡二叉树。

  2. 接下来,我们需要递归地判断每个节点的左右子树是否是平衡二叉树。如果某个节点的左右子树都是平衡二叉树,并且它们的高度差不超过1,则说明整个树是平衡二叉树。

  3. 最终,我们调用isBalanced函数判断根节点是否是平衡二叉树,即可得到最终的结果。