二叉搜索树的后序遍历序列
Hard;
Last updated
Hard;
Last updated
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
输入:
复制返回值:
Post-order traversal 特性:post-order traveral 的result 从右到左的打印相对于是pre-order traversal的打印的结果往相反顺序打印,即先打印右边再打印左边
举个例子
所以用post-order检查BST时,从右往左遍历array,并且用个stack记录当前最大值
当发现array[i] 的值< stack top的最大值,就不断把stack的最大值pop出来直到找到小于array[i]的值为止, 这个过程相对于遍历完右子树,返回上一层找左子树。
当往左遍历时如果发现node的值> 当前最大值,即左子树的值> parent 或 右子树的值,那么就return False
Time: 遍历每个array的值 O(n) , 因为push的个数= pop的个数,并非每次pop的都是O(n), 所以实际上是O(n) for popping +O(n) for iterating array = O(n)
Space: O(n)
Note: pre-order traversal 和 反转过来的post-order traversal 在树的遍历方向上是对称/相反的,pre-order traversal 从左往右, post-order traversal 反转顺序后是从右往左 而in-order traversal 相对于把tree 当成list一样平铺开来再打印