解法一 Recursion
思路
兩樹相同,則比較的兩個節點中不能有其中一個為 null,節點的值需要相等,兩個節點的左子樹和右子樹也要相等。
程式碼
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (q == null && p == null) return true;
if (q == null || p == null) return false;
if (q.val != p.val) return false;
return isSameTree(q.left, p.left) && isSameTree(q.right, p.right);
}
}
複雜度分析
- 時間複雜度
- 遍歷一遍二叉樹,花費 O(n) 時間
- 空間複雜度
- O(n) – Skewed Tree
- O(logn) – Balanced Tree
解法二 Iteration
思路
和遞迴思路相同,就是使用了 queue 儲存兩個樹將要比較的節點。(用 stack 也可以)
程式碼
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(p);
queue.offer(q);
while (!queue.isEmpty()) {
TreeNode ptree = queue.poll();
TreeNode qtree = queue.poll();
if (ptree == null && qtree == null) continue; // 當兩樹都是空樹時,繼續迴圈
else if (ptree == null || qtree == null) return false;
else if (ptree.val != qtree.val) return fasle;
else {
queue.offer(p.left);
queue.offer(q.left);
queue.offer(p.right);
queue.offer(q.right);
}
}
return true;
}
}
複雜度分析
- 時間複雜度
- O(N)
- 空間複雜度
- O(N) Keep the queue
Takeaway
第101題 symmetric tree 思路相同,p,q樹都是 root,然後左子樹和右子樹比,右子樹和左子樹比。recursion時需要滿足根節點相等且左右對稱。
本作品採用《CC 協議》,轉載必須註明作者和本文連結