剑指offer33.二叉搜索树的后序遍历序列 P179

mac2025-08-15  2

剑指offer33. 二叉搜索树的后序遍历序列 P179

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

首先要明确的是:每一个子序列的最后一个数是根结点(end标识)

找到左子树子序列,左子树子序列可以通过从当前子序列开始索引start向后扫描,直到出现比根结点大的元素就停止(因为左子树子序列都是小于根节点的);

剩下的子序列是右子树子序列(不包含子序列最后节点end也就是根节点),检查右子树子序列中所有元素是否都大于根结点元素,如果存在小于根节点的元素,则不满足二叉搜索树的定义,返回false.

递归地判断左子树和右子树是否是二叉搜索树。

bool isBSTPostOrder(int *num, int start, int end) { // 原始输入序列,子序列的首尾索引 if (num == NULL) return false; // 鲁棒性 (如果有主调函数可以放在主调里) if (start >= end) return true; // 没有发现异常,两个成功相遇 int root = num[end]; // 根节点是最后一个节点 int i = start; // 开始索引 for (; i < end; ++i) { // 从开始索引找第一个比根大的节点,注意条件不能=end if (num[i] > root) break; } // 此时i存的是第一个比根大的节点的索引 for (int j = i + 1; j < end ; ++j) { // 从下一个位置出发,看右子树有没有比根小的 if (num[j] < root) return false; } // 递归左右子树看是否满足BST return (isBSTPostOrder(num, start, i - 1) && isBSTPostOrder(num, i, end - 1)); } // 注意:这个递归函数的end参数是子序列最后一个索引,调用的时候传的length - 1
最新回复(0)