题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
这道题目很简单可以使用递归,迭代
方法一:
递归法
对于两个树中的相同位置的节点p和q,需要进行这样的比较
- 如果pnull而且qnull,那么这两棵树在此处位置是一样的,返回true
- 如果p==null或者q=null,那么不一样,返回false
- 如果p!=null而且q!=null,p.val==q.val,返回isSameTree(p.left,q.left)&&isSameTree(p.right,q.right),否则返回false。
java代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
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 isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
else
return false;
}
}
方法二:
迭代
简而言之就是循环将两棵树相同对应位置的节点p,q取出来,然后比较这两个节点是否相同,所以这里我们需要一个集合来存放节点p,q,这里我们使用的是双向队列
class Solution {
public boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
// one of p and q is null
if (q == null || p == null) return false;
if (p.val != q.val) return false;
return true;
}
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if (!check(p, q)) return false;
// 初始化队列
ArrayDeque<TreeNode> deqP = new ArrayDeque<TreeNode>();
ArrayDeque<TreeNode> deqQ = new ArrayDeque<TreeNode>();
deqP.addLast(p);
deqQ.addLast(q);
while (!deqP.isEmpty()) {
p = deqP.removeFirst();
q = deqQ.removeFirst();
if (!check(p, q)) return false;
if (p != null) {
// in Java nulls are not allowed in Deque
if (!check(p.left, q.left)) return false;
if (p.left != null) {
deqP.addLast(p.left);
deqQ.addLast(q.left);
}
if (!check(p.right, q.right)) return false;
if (p.right != null) {
deqP.addLast(p.right);
deqQ.addLast(q.right);
}
}
}
return true;
}
}