наткнулся на интересный момент. Не подскажите где может быть логическая ошибка?
Идея
1) Цикл работает пока оба итератера не уйдут в null
2) Если какой-то итератор null, а другой нет - то вернем false
3) Если текущие значения итераторов не равны друг другу - вернем false
4) Если значения детей не равны друг другу - вернем false
5) кладем в стек детей первого и второго итераторов
fun isSameTree(p: TreeNode?, q: TreeNode?): Boolean {
val leftStack = Stack<TreeNode?>()
leftStack.push(p)
val rightStack = Stack<TreeNode?>()
rightStack.push(q)
while (leftStack.peek() != null || rightStack.peek() != null) {
val l = leftStack.pop()
val r = rightStack.pop()
if ((l != null && r == null) || (l == null && r != null))
return false
if (l?.`val` != r?.`val`)
return false
if ((l?.left?.`val` != r?.left?.`val`) || (l?.right?.`val` != r?.right?.`val`))
return false
leftStack.push(l?.left)
rightStack.push(r?.left)
leftStack.push(l?.right)
rightStack.push(r?.right)
}
return true
}
Код имеет багу. Эмпирическим путем понял, что тут надо не класть в стек элемент, если он null, но не могу доказать себе почему. Не подскажите в чем ошибка?
😳😳😳 она в одну строчку решается обычной рекурсией ну или итеративно и проверкой правой и левой ноды уходя в поддеревья
возможно я не до конца понял задачу, но возможно деревья одинаковы, но по разному подвешены?
Обсуждают сегодня