二叉搜索树的后序遍历序列

来源:互联网 发布:八爪鱼头部按摩器 知乎 编辑:程序博客网 时间:2024/06/07 11:38

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

如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路:
已知条件后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
参考代码(不够精简,只为理清思路):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
classSolution {
public:
    boolVerifySquenceOfBST(vector<int> sequence) {
        vector<int> leftTree,rightTree;
        introot; // 根结点
        if(sequence.empty()) returnfalse;
        intindex = 0; // 标记左右子树界限
        intlen = sequence.size();
        root = sequence[len-1];
        inti=0;
        for(;i<len-1;++i)
        {
            if(sequence[i]>root) break// 找到第一个大于根结点的位置,则左边为左子树,右边为右子树
        }
        for(intj=i;j<len-1;++j) // 循环时去除root,因此为len-1
        {
            if(sequence[j]<root) returnfalse// 有一个小于root,则返回false
        }
         
        if(i!=0)
        {
            // 即有左子树
            for(intm=0;m<i;++m)
            {
                leftTree.push_back(sequence[m]);
            }
        }
        if(i!=len-2)
        {
            for(intj=i;j<len-1;++j)
            {
                rightTree.push_back(sequence[j]);
            }
        }
         
        boolleft = true,right = true// 看左右子树是否是二叉搜索树
        if(leftTree.size()>1) VerifySquenceOfBST(leftTree);
        if(rightTree.size()>1) VerifySquenceOfBST(rightTree);
         
        return(left&&right);
    }
};

0 0
原创粉丝点击