給定兩棵二叉樹的根節點 p 和 q,判斷它們是否完全相同。相同定義為:結構相同,且對應節點值相等。
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
// 都為空 → 相同
if (!p && !q) return true;
// 一空一不空 → 不同
if (!p || !q) return false;
// 值不同 → 不同
if (p->val != q->val) return false;
// 遞歸比較左右子樹
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
p: 1 q: 1
/ \ / \
2 3 2 3
比較流程:
1. 根 1==1 ✅
2. 左子樹 2==2 ✅ → 兩側均為葉子,返回 true
3. 右子樹 3==3 ✅ → 兩側均為葉子,返回 true
4. 總體 true
bool isSameTree(TreeNode* p, TreeNode* q) {
queue> que;
que.emplace(p, q);
while (!que.empty()) {
auto [n1, n2] = que.front(); que.pop();
if (!n1 && !n2) continue;
if (!n1 || !n2) return false;
if (n1->val != n2->val) return false;
que.emplace(n1->left, n2->left);
que.emplace(n1->right, n2->right);
}
return true;
}
bool isSameTree(TreeNode* p, TreeNode* q) {
stack> st;
st.emplace(p, q);
while (!st.empty()) {
auto [n1, n2] = st.top(); st.pop();
if (!n1 && !n2) continue;
if (!n1 || !n2) return false;
if (n1->val != n2->val) return false;
st.emplace(n1->right, n2->right);
st.emplace(n1->left, n2->left);
}
return true;
}
| 指標 | 遞歸 | BFS/DFS 迭代 |
|---|---|---|
| 時間 | O(min(N, M)) | O(min(N, M)) |
| 空間 | O(H) 遞歸棧 | O(W) 隊列/棧 (W=最大寬度) |
| 最壞空間 | O(N) 單鏈樹 | O(N) 滿二叉樹最後一層 |
若只判斷結構同構(忽略值),將 n1->val != n2->val 條件移除即可。