100. 相同的树

221 阅读1分钟

题目介绍

力扣100题:leetcode-cn.com/problems/sa…

image.png

方法一

既然要比较两棵二叉树是否相同,最简单的想法就是必须知道这两棵二叉树到底长啥样吧?那怎么描述二叉树长啥样呢?简单,可以遍历二叉树利用字符串表示。简单代码如下:

String traverse(TreeNode root) {
    // 对于空节点,可以用一个特殊字符表示
    if (root == null) {
        return "#";
    }
    // 将左右子树序列化成字符串
    String left = traverse(root.left);
    String right = traverse(root.right);
    /* 后序遍历代码位置 */
    // 左右子树加上自己,就是以自己为根的二叉树序列化结果
    String subTree = left + "," + right + "," + root.val;
    return subTree;
}

于是,改题目的完整代码就简单了,完整代码如下:

public boolean isSameTree(TreeNode p, TreeNode q) {
     return traverse(p).equals(traverse(q));
}

public String traverse(TreeNode root) {
    if(root == null) {
        return "#";
    }
    String left = traverse(root.left);
    String right = traverse(root.right);
    return left+","+right+","+root.val;
}

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

方法二

方法一的空间复杂度较高,其实没有必要额外利用其他的空间存储遍历结果,可以将两棵二叉树一边遍历一边比较,代码如下:

boolean isSameTree(TreeNode root1, TreeNode root2) {
    // 都为空的话,显然相同
    if (root1 == null && root2 == null) return true;
    // 一个为空,一个非空,显然不同
    if (root1 == null || root2 == null) return false;
    // 两个都非空,但 val 不一样也不行
    if (root1.val != root2.val) return false;

    // root1 和 root2 该比的都比完了
    return isSameTree(root1.left, root2.left)
        && isSameTree(root1.right, root2.right);
}

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(H),H为递归栈的调用深度,也即树的高度。