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

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

我的代码:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int nsize = sequence.size();
        if(nsize == 0) return false;
        int root = sequence[nsize - 1];
        int left = 0;
        int leftindex = 0;
        bool flag = true;
        for(int i = 0; i < nsize; i++)
        {
            if(sequence[i] > root)
            {
                left = sequence[i - 1];
                leftindex = i - 1;
                flag = false;
                break;
            }
        }
        if(flag)
            return true;
        for(int i = leftindex+1;i < nsize;i++)
        {
            if(sequence[i] < root )
                return false;
        }
        return true;
    }
};

 正确的代码:

解析:二叉搜索树,二叉排序树,二叉查找树,都是同一种东西:

1.它或者是一棵空树,

2.或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

               若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3.它的左、右子树也分别为二叉排序树。

由于是后序遍历,vector的最后一位是当前树的跟,我们找到vector中第一个大于root的值就是右子树的第一个节点(这个节点前面的则是左子树的跟),判断从此节点一直到最后都要大于根,(右子树要大于根)。再递归的判断左右子树是否为二叉搜索树。

还要注意递归的调用条件。

 1 class Solution {
 2 public:
 3     bool VerifySquenceOfBST(vector<int> sequence) {
 4         return BST(sequence,0,sequence.size()-1);
 5     }
 6     bool BST(vector<int> sequence , int begin, int end)
 7     {
 8         if(sequence.empty()||begin>end)
 9             return false;
10         int root = sequence[end];
11         int i = begin;
12         for(;i<end;i++)
13         {
14             if(sequence[i] > root)
15                 break;
16         }
17         for(int j = i; j < end; j++)
18             if(sequence[j] < root)
19                 return false;
20         bool left = true;
21         bool right = true;
22         if(i>begin)
23         left = BST(sequence,0,i-1);
24         if(i<end-1)
25         right = BST(sequence,i,end-1);
26         return left&&right;
27     }
28 };

 

posted @ 2018-04-02 15:06  Lune-Qiu  阅读(150)  评论(0编辑  收藏  举报