Сложность: medium
Дан узел в двоичном дереве поиска, верните его последующего (in-order successor) в этом дереве. Если у узла нет последующего, верните null.
Последующий узла — это узел с наименьшим ключом, большим, чем node.val.
Вы будете иметь прямой доступ к узлу, но не к корню дерева. Каждый узел будет иметь ссылку на своего родителя. Ниже приведено определение для Node:
class Node {
public int val;
public Node left;
public Node right;
public Node parent;
}Пример:
Input: tree = [5,3,6,2,4,null,null,1], node = 6
Output: null
Explanation: There is no in-order successor of the current node, so the answer is null.
👨💻 Алгоритм:
1⃣Проверка правого поддерева
Если у узла есть правый потомок, перейдите к правому узлу, затем спускайтесь влево до самого нижнего узла. Этот узел будет следующим узлом в порядке in-order.
2⃣Поиск предка
Если у узла нет правого потомка, поднимайтесь по дереву до тех пор, пока узел не станет левым потомком своего родителя. Родитель этого узла будет следующим узлом в порядке in-order.
3⃣Возвращение результата
Верните найденный узел или null, если следующий узел не найден.
😎 Решение:
class Node {
var val: Int
var left: Node?
var right: Node?
var parent: Node?
init(_ val: Int) {
self.val = val
}
}
class Solution {
func inorderSuccessor(_ x: Node?) -> Node? {
var x = x
if let right = x?.right {
x = right
while let left = x?.left {
x = left
}
return x
}
while let parent = x?.parent, x === parent.right {
x = parent
}
return x?.parent
}
}Ставь 👍 и забирай 📚 Базу знаний
