2019 năm 07 tháng 21 ngày Máy tính 1 Mô tả bài toán Cho một cây nhị phân, hãy xác định xem nó có phải là một cây nhị phân hoàn chỉnh hay không. Theo định nghĩa từ Wikipedia về cây nhị phân hoàn chỉnh: Trong một cây nhị phân hoàn chỉnh, ngoại trừ tầng cuối cùng có thể chưa được lấp đầy hoàn toàn, tất cả các tầng khác đều đã được lấp đầy hoàn toàn, và các nút ở tầng cuối cùng phải được sắp xếp càng gần bên trái càng tốt. Số lượng nút ở tầng cuối cùng h nằm trong khoảng [1, 2^h]. Lưu ý: Số lượng nút nằm trong khoảng [1, 100]. Ví dụ 1:
1
/ \
2 3
/ \ /
4 5 6
Đầu vào: [1,2,3,4,5,6] Đầu ra: true Ví dụ 2:
1
/ \
2 3
/ \ \
4 5 7
Đầu vào: [1,2,3,4,5,null,7] Đầu ra: false Nguồn bài toán: LeetCode 2 Ý tưởng giải quyết Gán số thứ tự cho các nút, sử dụng phương pháp duyệt theo mức (level-order traversal) bắt đầu từ nút gốc có số thứ tự là 1 để duyệt qua cây nhị phân. Trong mỗi lần duyệt, kiểm tra xem số thứ tự của nút anh em trước đó có liên tiếp với số thứ tự hiện tại hay không. Nếu không liên tiếp, điều này có nghĩa là cấu trúc của cây nhị phân hoàn chỉnh đã bị phá vỡ, trả về false; Nếu duyệt hết i9bet41 tất cả các nút game 123win mà không phát hiện vi phạm quy tắc của cây nhị phân hoàn chỉnh, thì trả về true. 3 Mã nguồn các game quay hũ uy tín Golang
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
type withNo struct {
*TreeNode
No int
}
func isCompleteTree(root *TreeNode) bool {
var nodes []withNo
preNo := 0
no := 1
nodes = append(nodes, withNo{root, no})
for len(nodes) > 0 {
node := nodes[0]
if preNo+1 != node.No {
return false
}
nodes = nodes[1:]
no++
if nil != node.Left {
nodes = append(nodes, withNo{node.Left, no})
}
no++
if nil != node.Right {
nodes = append(nodes, withNo{node.Right, no})
}
preNo = node.No
}
return true
}
