Sword se refiere a la oferta 33. Secuencia transversal posterior al pedido del árbol de búsqueda binaria
Descripción del Título
Ideas para resolver problemas
Si solo se conoce la secuencia transversal posterior al orden del árbol binario ordinario, no se puede restaurar el árbol binario original, porque no se puede determinar el rango de subíndices de los subárboles izquierdo y derecho.
Pero esta pregunta es un árbol de búsqueda binario, que puede determinar el rango de subíndices de los subárboles izquierdo y derecho en función de propiedades especiales.
Además, si endOfLeft
y index
al descender, debemos prestar atención a los problemas transfronterizos del subíndice , y el margen izquierdo aquí no es 0, sino que comienza.
class Solution {
public boolean verifyPostorder(int[] postorder) {
if (postorder.length == 0) return true;
return verifyPostorder(postorder, 0, postorder.length - 1);
}
//判断 postorder[begin...end] 是否是二叉搜索树的后序遍历结果
public boolean verifyPostorder(int[] postorder, int begin, int end) {
// base case
if (begin >= end) return true;
int endOfLeft = end; //左子树的结束索引
//左子树结束索引对应的元素是第一个比 postorder[end] 小的元素
while (endOfLeft >= begin && postorder[endOfLeft] >= postorder[end]) endOfLeft--;
//由于上面 while 遍历时,已经确保了右子树的所有元素都大于 postorder[end],所以要继续判断左子树的正确性
int index = endOfLeft;
while (index >= begin && postorder[index] < postorder[end]) index--;
//首先要保证左子树的正确性,然后继续遍历左子树和右子树
return (index + 1 == begin) && verifyPostorder(postorder, begin, endOfLeft)
&& verifyPostorder(postorder, endOfLeft + 1, end - 1);
}
}