題目描述:給定兩個二叉樹,編寫一個函數來檢驗它們是否相同。
如果兩個樹在結構上相同,並且節點具有相同的值,則認爲它們是相同的。
這道題目很簡單可以使用遞歸,迭代
方法一:
遞歸法
對於兩個樹中的相同位置的節點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;
}
}