public class Solution { public boolean isValidBST(TreeNode root) { return isValid(root, null, null); } private boolean isValid(TreeNode p, Integer low, Integer high) { if (p == null) { return true; } return (low == null || p.val > low) && (high == null || p.val < high) && isValid(p.left, low, p.val) && isValid(p.right, p.val, high); } }
В BST левый дочерний узел меньше своего родительского, а правый дочерний узел всегда больше своего родительского. Решение основано на этом свойстве. В функции isValid
мы рекурсивно проверяем, имеет ли узел значение между low
и высокий
. Существует крайний случай, когда узел может иметь значение, равное Integer. МИНИМАЛЬНОЕ ЗНАЧЕНИЕ
или Целое число. МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ
. Поэтому мы используем null
для представления бесконечности.
Временная сложность : O(n)
Временная сложность : O(n)
public class Solution { private TreeNode prev; public boolean isValidBST(TreeNode root) { prev = null; return isMonotonicIncreasing(root); } private boolean isMonotonicIncreasing(TreeNode p) { if (p == null) { return true; } if (isMonotonicIncreasing(p.left)) { if (prev != null && p.val <= prev.val) { return false; } prev = p; return isMonotonicIncreasing(p.right); } return false; } }
Если дерево является допустимым, НО, его элементы должны строго следовать возрастающему порядку в рамках обхода по порядку. Мы можем использовать это свойство для решения проблемы. Чтобы узнать больше о обходе по порядку, пожалуйста, ознакомьтесь с этой ссылкой . Мы определяем prev
, чтобы отслеживать предыдущий элемент при обходе по порядку. Всякий раз, когда мы обнаруживаем, что существует древовидный узел p
, который меньше, чем предыдущий
, мы знаем, что дерево не является допустимым BST.
Временная сложность : O(n)
Дополнительное пространство : O(1)
Оригинал: “https://dev.to/algobot76/leetcode-98-validate-binary-search-tree-4o29”