Проверка, является ли дерево двоичным деревом поиска

1

Я не могу понять, как функция Java ЗДЕСЬ (прокрутите страницу до самого конца страницы) проверяет, является ли дерево BST или нет, поскольку код не похож на использование min и max вообще. Я также копирую код здесь

/** 
 Tests if a tree meets the conditions to be a 
 binary search tree (BST). Uses the efficient 
 recursive helper. 
*/ 
public boolean isBST2() { 
 return( isBST2(root, Integer.MIN_VALUE, Integer.MAX_VALUE) ); 
}
/** 
  Efficient BST helper -- Given a node, and min and max values, 
  recurs down the tree to verify that it is a BST, and that all 
  its nodes are within the min..max range. Works in O(n) time -- 
  visits each node only once. 
*/ 
private boolean isBST2(Node node, int min, int max) { 
  if (node==null) { 
    return(true); 
  } 
  else { 
   // left should be in range  min...node.data 
    boolean leftOk = isBST2(node.left, min, node.data);

    // if the left is not ok, bail out 
    if (!leftOk) return(false);

    // right should be in range node.data+1..max 
    boolean rightOk = isBST2(node.right, node.data+1, max);

    return(rightOk); 
  } 
} 
  • 0
    Код имеет метод isBST2 (): P. Просто проверка min max условий пропускается.
  • 0
    «Лучшее решение смотрит на каждый узел только один раз. Хитрость заключается в том, чтобы написать вспомогательную функцию утилиты isBSTRecur (struct node * node, int min, int max), которая перемещается по дереву, отслеживая сужающиеся минимальные и максимальные допустимые значения, так как идет, глядя на каждый узел только один раз. Начальные значения для min и max должны быть INT_MIN и INT_MAX - они сужаются оттуда. "
Показать ещё 1 комментарий
Теги:
binary-search-tree

2 ответа

1
Лучший ответ

Дерево является BST тогда и только тогда, когда узлы обходного пути являются монотонными. Самый простой способ подумать об этом состоит в том, что если корень имеет значение n, то левая ветвь также должна быть BST, узлы которой не более n, а правая часть должна быть BST, узлы которой не менее n, Если эти условия выполнены, то дерево в целом является BST.

Это именно то, что ваш код почти делает. Он проверяет, что дерево является BST с заданным минимумом заданного максимума. Он рекурсивно вызывает себя, просматривая корневой узел с данными значения, а затем проверяет, что левая ветвь является BST, ни один из узлов которой не превышает данные, а правая ветвь - BST, ни один из узлов которой меньше данные.

Но на самом деле это не совсем так... он пропускает проверку мин/макс! Возможно, вы должны добавить это сами? Это домашнее задание?

Место для его добавления будет здесь:

if (node==null) { 
  return(true); 
}

Вам просто нужно несколько дополнительных условий, если node!=null...

  • 0
    Где находится код, который проверяет, «ни один из узлов не превышает данные, и что правая ветвь не является BST, ни один из узлов не меньше данных».
  • 0
    @ Andy897 извини, это опасность публикации, пока я все еще редактировал ... это ничего не значит. Я предполагаю, что вы должны добавить это.
Показать ещё 1 комментарий
0
boolean checkBST(Node root) {
    return  c(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}

boolean c(Node n, int s, int b) {
    return n == null || (n.data > s && n.data < b && c(n.left, s, n.data) && c(n.right, n.data, b));
}
  • 2
    Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную краткосрочную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню