Ngày win 911 16 tháng 11 năm 2019 - Máy tính
1. Mô tả bài toán
Cho một cây nhị phân, hãy trả về danh sách các giá trị nút theo thứ tự duyệt sau (post-order traversal).
Lưu ý: Việc thực hiện bằng phương pháp đệ quy khá đơn giản, nhưng có thể thực hiện được bằng cách lặp lại (iterative) không?
Ví dụ: Đầu vào: [1,null,2,3]
1
\
2
/
3
Đầu ra: [3,2,1]
Nguồn bài toán: LeetCode
2. Cách w9bet register tiếp cận giải quyết
Thứ tự duyệt sau (post-order traversal) là trái-phải-gốc. Bắt đầu từ gốc, chúng ta có thể áp dụng cách duyệt theo thứ tự “gốc-phải-trái”, sau đó đảo ngược mảng kết quả để đạt được thứ tự cuối cùng.
Ý tưởng này dựa trên việc lưu trữ các phần tử của nhánh trái trong một mảng riêng biệt vì nhánh trái sẽ được duyệt sau cùng. Ban đầu, chúng ta thêm gốc vào mảng này.
Do thứ tự “gốc-phải-trái” yêu cầu duyệt phải trước khi đến trái, nên khi đã duyệt xong nhánh phải, chúng ta cần lấy phần tử trái từ mảng tạm thời và xử lý nó trước.
Tóm tắt các bước của thuật toán như sau:
Khi mảng chứa các phần tử nhánh trái chưa trống: a) Lấy nút cuối cùng từ mảng (tại vị trí len-1), sau đó duyệt liên tục nút đó và các con phải của nó, ghi lại các giá trị này. Nếu có nhánh trái, thêm nó vào mảng tạm thời. b) Lặp lại bước a) cho đến khi mảng tạm thời trống.
3. Mã nguồn Golang
func postorderTraversal(root *TreeNode) []int {
if root == nil {
return []int{}
}
var vals []int
leftNodes := []*TreeNode{root}
for len(leftNodes) > 0 {
node := leftNodes[len(leftNodes)-1]
leftNodes = leftNodes[:len(leftNodes)-1]
for node != nil {
vals = append([]int{node.Val}, vals...)
if node.Left != nil {
leftNodes = append(leftNodes, node.Left)
}
node = node.Right
}
}
return vals
}
Từ khóa: #Golang #ThuậtToán