解法一
思路
直觀地判斷是否是相同的樹:如果兩個樹的同位置節點不相等,返回false。如果兩者有一個為 Null,返回 false。如果都為 null, 返回 true。
程式碼
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 false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
複雜度分析
- 時間複雜度 O(N) 每個節點都會經過
- 空間複雜度
- 最好情況 O(logN) 完全平衡二叉樹
- 最壞情況 O(N) 所有數都在 left subtree
解法二
思路
通過入隊出隊操作,將兩個樹的同位置元素進行比較。
程式碼
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(p);
queue.add(q);
while (!queue.isEmpty()) {
TreeNode ptree = queue.poll();
TreeNode qtree = queue.poll();
if (ptree == null && qtree == null) continue;
if (ptree == null || qtree == null || ptree.val != qtree.val) return false;
queue.add(ptree.left);
queue.add(qtree.left);
queue.add(ptree.right);
queue.add(qtree.right);
}
return true;
}
}
複雜度分析
- 時間複雜度 O(N)
- 空間複雜度 O(N) (因為會把所有元素儲存在裡面?)
Takeaway
- 先序遍歷,中序遍歷,後序遍歷