#BST0000012. Kiểm tra một cây có phải BST (Validate a Binary Search Tree)
Kiểm tra một cây có phải BST (Validate a Binary Search Tree)
Kiểm tra một cây có phải BST (Validate a Binary Search Tree)
Nguồn: Phước Hưng OJ
Phiên bản: Phước Hưng OJ Extended
Đề bài
Cho trực tiếp một cây nhị phân có nút. Mỗi nút mang một khóa và có thể có con trái, con phải.
Cây được gọi là một BST nghiêm ngặt nếu với mọi nút có khóa :
- mọi khóa trong toàn bộ cây con trái đều nhỏ hơn ;
- mọi khóa trong toàn bộ cây con phải đều lớn hơn .
Điều kiện phải đúng với toàn bộ hậu duệ, không chỉ với hai nút con trực tiếp. Vì vậy, hai nút cha - con có thể thỏa so sánh cục bộ nhưng cây vẫn không phải BST nếu một hậu duệ nằm sai miền giá trị.
Hãy xác định cây đã cho có phải một BST nghiêm ngặt hay không.
Input
Dòng đầu chứa hai số nguyên và , trong đó là chỉ số nút gốc. Nếu thì .
Nếu , tiếp theo có đúng dòng. Dòng thứ mô tả nút bằng ba giá trị key left right:
key là khóa của nút ;
left là chỉ số con trái của nút ;
right là chỉ số con phải của nút .
Giá trị chỉ số bằng nghĩa là không có nút con tương ứng. Các chỉ số nút hợp lệ khác nằm trong đoạn .
Dữ liệu được bảo đảm mô tả đúng một cây nhị phân có gốc : không có chu trình, mọi nút đều thuộc cây và mỗi nút khác gốc có đúng một cha. Khóa của các nút không được bảo đảm phân biệt.
Output
In YES nếu cây là BST nghiêm ngặt.
Ngược lại, in NO.
Subtask
Subtask 1 (20 điểm): .
Subtask 2 (30 điểm): .
Subtask 3 (50 điểm): .
Trong tất cả các subtask, mỗi khóa là số nguyên có dấu 64-bit.
Ví dụ
Input
5 1
8 2 3
3 4 5
10 0 0
1 0 0
9 0 0
Output
NO
Giải thích
Nút là gốc và có khóa . Nút nằm trong cây con trái của gốc và có khóa . Nút lại nằm trong cây con của nút , nên cũng thuộc toàn bộ cây con trái của khóa .
Tuy nhiên nút có khóa . Vì một khóa lớn hơn xuất hiện trong cây con trái của gốc, cây vi phạm điều kiện BST nghiêm ngặt và output là NO.