Menu
CoddyTech

Construct Binary Tree from Preorder and Inorder Traversal

Bạn nhận được hai mảng, preorder và inorder, liệt kê các giá trị phân biệt của cùng một cây nhị phân. Duyệt theo thứ tự trước sẽ thăm một nút, rồi đến cây con bên trái, sau đó đến cây con bên phải. Duyệt theo thứ tự giữa sẽ thăm cây con bên trái, rồi đến nút, sau đó đến cây con bên phải.

Hãy dựng lại cây và trả về dưới dạng mảng theo thứ tự từng tầng: nút gốc ở chỉ số 0, các nút con của chỉ số i ở 2i+1 (bên trái) và 2i+2 (bên phải), đồng thời điền -1 vào mọi vị trí trống. Mảng kết thúc ở nút cuối cùng, không có -1 ở cuối.

Hàm

buildTree(preorder: integer-array, inorder: integer-array) → integer-array
preorderinteger-array
các giá trị theo thứ tự tiền thứ tự (preorder): nút, cây con trái, cây con phải
inorderinteger-array
các giá trị theo thứ tự duyệt giữa (inorder): cây con trái, nút, cây con phải
Trả vềinteger-array
cây theo thứ tự từng mức, dùng -1 cho các vị trí trống và không có -1 ở cuối

Ràng buộc

  • 1 ≤ preorder.length ≤ 3000
  • inorder.length == preorder.length
  • 0 ≤ preorder[i] ≤ 104, và tất cả các giá trị đều khác nhau.
  • inorder chứa cùng các giá trị và cả hai mảng đều mô tả cùng một cây nhị phân.
  • Độ sâu của cây tối đa là 14, vì vậy mọi chỉ số trong đáp án đều nhỏ hơn 214-1 = 16383.

Ví dụ

Đầu vào
preorder = [7, 3, 0, 9, 4, 6]inorder = [0, 3, 9, 7, 4, 6]
Đầu ra
[7, 3, 4, 0, 9, -1, 6]
Giải thích
Thứ tự duyệt tiền thứ tự bắt đầu từ nút gốc, 7. Nút này nằm ở vị trí 3 trong thứ tự duyệt trung thứ tự, nên 0, 3, 9 nằm bên trái và 4, 6 nằm bên phải. 4 chỉ có nút con bên phải là 6, nên chỉ số 5 giữ nguyên giá trị -1.
challenge icon

Câu hỏi mở rộng

Bạn có thể dựng lại cây mà không dùng đệ quy, chỉ duyệt preorder một lượt với một ngăn xếp tường minh không?

Đặt lại code
def buildTree(preorder, inorder):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Đối số

preorder = [7, 3, 0, 9, 4, 6]
inorder = [0, 3, 9, 7, 4, 6]

Đầu ra mong đợi

[7, 3, 4, 0, 9, -1, 6]