美文网首页二叉树
【剑指 offer】二叉搜索树的后序遍历序列

【剑指 offer】二叉搜索树的后序遍历序列

作者: 邓泽军_3679 | 来源:发表于2019-04-14 08:51 被阅读0次

    1、题目描述

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

    如果是则返回true,否则返回false。

    假设输入的数组的任意两个数字都互不相同。

    样例:

    输入:[4, 8, 6, 12, 16, 14, 10]
    输出:true

    2、问题描述:

    • 判断一个二叉树是否是BST的后序遍历的结果。

    3、问题关键:

    • BST具有根结点比左孩子都大,比右孩子都小。
    • 后序遍历:左 右 根。故把序列分成3部分,先左边全部小于根的结点,再判断结下的是否全部是大于根的,如果不是则返回false;
    • BST的左右孩子也都是BST。递归遍历左右孩子。

    4、C++代码:

    class Solution {
    public:
        vector<int> s;
        bool verifySequenceOfBST(vector<int> sequence) {
            s = sequence;
            return dfs(0, s.size() - 1);
        }
        bool dfs(int l , int r) {
            if (l >= r)  return true;//遍历完了所有结点都符合了。
            int k = l;
            int root = s[r];//当前序列的根结点。
            while(k < r && s[k] < root) k ++;//找到左子树。
            for (int i = k; i < r; i++) {
                if (s[i] < root) return false;//如果右子树有小于根的那么就不是 BST。
            }
            return dfs(l, k - 1) && dfs(k, r - 1);//递归遍历左右子树是否是BST。
        }
    };
    

    相关文章

      网友评论

        本文标题:【剑指 offer】二叉搜索树的后序遍历序列

        本文链接:https://www.haomeiwen.com/subject/qtcjwqtx.html