# 1. 深度优先搜索
1. 如果两个结点都为空则两个二叉树相同,
2. 如果其中一个结点为空,则两个二叉树不相同,
3. 如果节点值相同,在判断左子树和右子树是否相同。
递归的判断两个子树是否相同。
class Solution { | |
public boolean isSameTree(TreeNode p, TreeNode q) { | |
if (p == null && q == null) { | |
return true; | |
} else if (p == null || q == null) { | |
return false; | |
} else if (p.val != q.val) { | |
return false; | |
} else { | |
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); | |
} | |
} | |
} |
时间复杂度:O (min (m,n)),其中 m 和 n 分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。
空间复杂度:O (min (m,n)),其中 m 和 n 分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。
# 2. 广度优先搜索
同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。
class Solution { | |
public boolean isSameTree(TreeNode p, TreeNode q) { | |
if (p == null && q == null) { | |
return true; | |
} else if (p == null || q == null) { | |
return false; | |
} | |
Queue<TreeNode> queue1 = new LinkedList<TreeNode>(); | |
Queue<TreeNode> queue2 = new LinkedList<TreeNode>(); | |
queue1.offer(p); | |
queue2.offer(q); | |
while (!queue1.isEmpty() && !queue2.isEmpty()) { | |
TreeNode node1 = queue1.poll(); | |
TreeNode node2 = queue2.poll(); | |
if (node1.val != node2.val) { | |
return false; | |
} | |
TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right; | |
if (left1 == null ^ left2 == null) { | |
return false; | |
} | |
if (right1 == null ^ right2 == null) { | |
return false; | |
} | |
if (left1 != null) { | |
queue1.offer(left1); | |
} | |
if (right1 != null) { | |
queue1.offer(right1); | |
} | |
if (left2 != null) { | |
queue2.offer(left2); | |
} | |
if (right2 != null) { | |
queue2.offer(right2); | |
} | |
} | |
return queue1.isEmpty() && queue2.isEmpty(); | |
} | |
} |