Lật Ngược Cây Nhị PhânInvert Binary Tree
Hiểu bài
Cho root của một cây nhị phân (Binary Tree).
Lật ngược cây — đổi chỗ con trái và con phải tại mọi node — rồi trả về root.
class TreeNode {
val: number
left: TreeNode | null
right: TreeNode | null
}
// 4 4
// / \ / \
// 2 7 → 7 2
// / \ / \ / \ / \
// 1 3 6 9 9 6 3 1Lật cây là bài tập đệ quy kinh điển: tại mỗi node, đổi chỗ hai con rồi lật tiếp hai cây con.
Đây là một dạng duyệt theo chiều sâu (DFS).
Lời giải tối ưu
O(n) time, O(h) space (h là chiều cao cây, do ngăn xếp đệ quy)function invertTree(root: TreeNode | null): TreeNode | null {
if (!root) return null
// Lật hai cây con trước, rồi đổi chỗ
const left = invertTree(root.left)
const right = invertTree(root.right)
root.left = right
root.right = left
return root
}Đệ quy theo chiều sâu là cách tối ưu: gọi lật cho cây con trái và phải, sau đó hoán đổi hai con tại node hiện tại.
- Mỗi node được thăm đúng một lần → O(n).
- Bộ nhớ phụ là độ sâu của ngăn xếp đệ quy, tệ nhất O(n) với cây lệch, tốt nhất O(log n) với cây cân.
Chạy thử từng bước
- 1
invertTree(4): root tồn tại → đệ quy xuống hai cây con.
node:4 - 2
Tại node 2: đổi chỗ con → left=3, right=1.
node:2left:3right:1 - 3
Tại node 7: đổi chỗ con → left=9, right=6.
node:7left:9right:6 - 4
Quay lại node 4: root.left=node7(đã lật), root.right=node2(đã lật) → toàn cây phản chiếu.
node:4left:7right:2
Trường hợp biên phải nhớ
root = null (cây rỗng) → trả về null ngay.
Một node duy nhất → không có con để đổi → trả về chính nó.
Cây lệch hẳn một bên (chỉ có con trái) → sau khi lật, nhánh chuyển sang con phải.
Cây cân đầy đủ → mọi cặp con đều được hoán đổi.