题目
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
算法思路1
使用迭代方法,比较俩颗树的结构和数值
只要每次一一对应地将结点放入队列,再一一对应地取出比较。当树的结构不相同时,两颗树每次都入队相同数量的结点,取出相同数量的结点,必然导致值不同。当树结构相同,但值不同时,也能比较值得到结果。
代码
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
queue1.add(p); //就算p==null,也会加入队列中,指向null
queue2.add(q);
while(!queue1.isEmpty() || !queue2.isEmpty()){ //俩个队列全部输出出来
TreeNode a = queue1.remove();
TreeNode b = queue2.remove();
if(a == null && b == null) continue; //跳过本次循环,继续下一次循环
if(a == null) return false; //比较结构是否不同
if(b == null) return false;
if(a.val != b.val) return false; //比较值是否不同
queue1.add(a.left);
queue1.add(a.right);
queue2.add(b.left);
queue2.add(b.right);
}
return true ;
}
}
复杂度分析
时间复杂度 : O(n),其中 n 是树的结点数,因为每个结点都访问一次。空间复杂度 : 最优情况(完全平衡二叉树)时为 O(log(n)),最坏情况下(完全不平衡二叉树)时为 O(n),用于维护递归栈。
思路2
使用递归
代码
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if (p == null || q == null) return false;
if (p.val != q.val) return false;
else return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
递归条件,树的根结点,结构一样且数值一样,左右子树叶是相同的树。
复杂度和迭代的一样。