题目介绍
力扣100题:leetcode-cn.com/problems/sa…
方法一
既然要比较两棵二叉树是否相同,最简单的想法就是必须知道这两棵二叉树到底长啥样吧?那怎么描述二叉树长啥样呢?简单,可以遍历二叉树利用字符串表示。简单代码如下:
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为递归栈的调用深度,也即树的高度。