# 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();  | |
    } | |
} |