天天看点

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

给出一个数组,该如何判定是否为一个搜索二叉树的后续遍历序列呢

首先来看搜索二叉树的满足条件:

  • 节点左孩子的关键码小于根节点
  • 节点右孩子的关键码大于根节点
  • 节点的关键码key  都互不相同
  • 左右子树都是一颗二叉搜索树

这样我们很容易给出一个范例如下图:

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

我们可以得出其后续遍历序列为: 0 2 1 4 3 69 8 7 5

我们这里以数组{0,2,1,4,3,6,9,8,7,5}为例

我们知道,后续遍历序列的最后一个节点的数字 5 就是根节点的值,在这个数组中,

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

可以看到前五个数组都比5小,因为为值为5的节点的左子树节点,后四个都比5大,因为为值为5的节点的右子树节点

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

接下来我们用同样的方法确定数组每一部分对应的字树结构,这样就成了一个递归问题,

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

找到这样的规律之后我们就可以写出如下代码:

bool Part(vector<int> sequence, int begin, int size)

{

if (size <= 0)

return false;

int root = sequence[size - 1];

int i = begin;

for (; i<size - 1; ++i)

{

if (sequence[i]>root)

break;

}

int j = i;

for (; j<size - 1; ++j)

{

if (sequence[j]<root)

return false;

}

bool left = true;

if (i>begin)

left = Part(sequence, begin, i);

bool right = true;

if (i<size - 1)

right = Part(sequence, begin + i, size-1);

return left&&right;//左右有一个不符合则返回false

}

bool VerifySquenceOfBST(vector<int> sequence)  {

return Part(sequence, 0, sequence.size());

}

继续阅读