您的位置:首页 > 职场人生

剑指offer面试题之判断二叉搜索树的后序序列

2016-04-02 18:26 399 查看
1,问题:

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

2,想法:

后序序列的最后一个结点为根节点,根节点的左孩子树都比它小,右孩子树都比它大,所以可以根据最后一个结点把序列分成两个部分,分成两个部分后又可以继续递归判断。而递归的出口是,当递归到序列中只有一个孩子时,返回true,当当前根节点不能把当前序列分成两个部分时,就返回false。

3,编码:

class Solution {
public:
bool isBST(vector<int> s, int start, int end)
{
if (start == end)//序列只有一个孩子时
{
return true;
}
int i;
//下边两个for循环既可以判断当前的根能否完整的把序列分成两个左右孩子序列
//从而判断是否是后序序列
//又能找到下层递归的起始位置
for (i = start; i < end;)
{
if (s[i] < s[end])
i++;
else
break;
}
for (i; i < end;)
{
if (s[i] > s[end])
i++;
else
break;
}
if (i < end)//这里判断是否在找到第一个大于根的节点后,序列中又有小于根的节点
{           //若有则i不回增加到end,就不是一个后序序列
return false;
}
if (i - start == 0)//说明当前后序序列代表的树没有左孩子
{
return isBST(s, start, end - 1);
}
else if (i == end)//表示没有右孩子
{
return isBST(s, start, end - 1);
}
else
{
return isBST(s, start, i - 1) && isBST(s, i, end - 1);
}
}
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty())
{
return false;
}
return isBST(sequence, 0, sequence.size() - 1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: