【LeetCode刷题(中等程度)】剑指 Offer 33. 二叉搜索树的后序遍历序列

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

参考以下这颗二叉搜索树:
【LeetCode刷题(中等程度)】剑指 Offer 33. 二叉搜索树的后序遍历序列_第1张图片

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:后序遍历中最后一个节点为根,我们依次查看左子树和右子树是不是BST, 这里存在递归。需要知道的一个知识点是,在BST的后序遍历中,根节点存在在最后一个位置,根节点左子树都小于根节点,根节点右子树都大于根节点。
根据这一特性,我们尝试在后序遍历序列中找到左子树序列和右子树序列。如果在右子树序列中找到比根节点小的值,那么就不是BST的后序遍历,直接返回false

class Solution {
public:
    bool verifyPostorder(vector& postorder) {
        int len = postorder.size();
        if (len == 0) {
            return true;
        }

        int i = 0;//记录可能为左右子树的分界点
        vector postorder_lef, postorder_rig;
        for (;i < len - 1; i++) {
            if (postorder[i] > postorder[len - 1]) {//找到第一个大于根节点的节点
                break;
            }
            postorder_lef.emplace_back(postorder[i]);  // 左子树元素加入到postorder_lef
        }
        int j = i;
        for (; j < len - 1; j++) {
            if (postorder[j] < postorder[len - 1]) {//如果右子树存在比根节点小的
                return false;//说明不是BST的后序遍历序列
            }
            postorder_rig.emplace_back(postorder[j]);//右子树元素加入postorder_rig
        }
        bool left = true;
        if (i > 0) {  // 存在左子树时,进行递归校验,不存在,则左子树默认true
            left = verifyPostorder(postorder_lef);
        }
        bool right = true;
        if (i < len - 1) {  // 存在右子树时,进行递归校验,不存在,则右子树默认true
            right = verifyPostorder(postorder_rig);
        }
        return left && right;
    }
};

你可能感兴趣的:(LeetCode刷题)