Bạn nên gọi hàm như dưới đây. Trong đó INT_MIN và INT_MAX được xác định không đổi.
IsValidBST (root, INT_MIN, INT_MAX)
Nhưng cách tiếp cận này sẽ không hoạt động đối với tất cả dữ liệu. Có nghĩa là, dữ liệu mà chúng tôi không biết giá trị MIN và MAX, như chuỗi hoặc bất kỳ loại người dùng tùy ý nào được xác định.
Để tìm hiểu xem liệu BT có phải là BST cho bất kỳ kiểu dữ liệu nào, bạn cần đi với cách tiếp cận dưới đây. 1. gọi hàm đệ quy cho đến cuối nút lá bằng cách sử dụng inorder traversal 2. Tự xây dựng các giá trị tối thiểu và giá trị tối đa của mình.
Miễn là phần tử cây phải nhỏ hơn/lớn hơn toán tử được xác định.
#define MIN (FirstVal, SecondVal) ((FirstVal) < (SecondVal)) ? (FirstVal):(SecondVal)
#define MAX (FirstVal, SecondVal) ((FirstVal) > (SecondVal)) ? (FirstVal):(SecondVal)
template <class T>
bool IsValidBST (treeNode &root)
{
T min, max;
return IsValidBST (root, &min, &max);
}
template <class T>
bool IsValidBST (treeNode *root, T *MIN , T *MAX)
{
T leftMin, leftMax, rightMin, rightMax;
bool isValidBST;
if (root->leftNode == NULL && root->rightNode == NULL)
{
*MIN = root->element;
*MAX = root->element;
return true;
}
isValidBST = IsValidBST (root->leftNode, &leftMin, &leftMax);
if (isValidBST)
isValidBST = IsValidBST (root->rightNode, &rightMin, &rightMax);
if (isValidBST)
{
*MIN = MIN (leftMIN, rightMIN);
*Max = MAX (rightMax, leftMax);
}
return isValidBST;
}
việc triển khai đó không thành công một thử nghiệm đơn giản. –
@SteveHaigh bạn có thể vui lòng cho tôi biết có lỗi gì không? –
Một trường hợp thử nghiệm thất bại là: root.data = 3, đã để lại con cũng với dữ liệu = 3. Điều này là hợp lệ nhưng mã của bạn (tôi nghĩ rằng, nếu tôi thực hiện một cách chính xác) nói rằng nó không phải là. Nếu bạn thay đổi "<=" thành "<" việc này sẽ sửa lỗi. –