每天一算法(判断该数组是不是某二元查找树的后序遍历的结果)

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.

      8
     / \
   6   10
  / \    / \
  5  7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。


分析:

        判断其是否为二元查找树的后序遍历结果,就需要知道后序遍历的特定:最后一个元素为根;又因为为二元查找树,即任意一个元素的值都大于左子节点的值,小于右子节点的值。所以,在遍历该序列时,从遇到第一个大于根元素的值开始一直到根元素之前,都是位于该元素的右子树上,而从第一个元素到第一个大于该根元素的值之前,都位于该根元素的左子树上;我们可以依此来对该序列进行左右子树划分,然后再对划分得到的左右子树递归……


bool IsAfer(int squ[], int length)
{
      if(squ == NULL || length <= 0)
            return false;

      int root = squ[length - 1];

      int i = 0;
      for(; i < length - 1; ++ i)
      {
            if(squ[i] > root)
                  break;
      }

      int j = i;
      for(; j < length - 1; ++ j)
      {
            if(squ[j] < root)
                  return false;
      }

      bool left = true;
      if(i > 0)
            left = IsAfer(squ, i);

      bool right = true;
      if(i < length - 1)
            right = IsAfer(squ + i, length - i - 1);

      return (left && right);
}



你可能感兴趣的:(每天一算法(判断该数组是不是某二元查找树的后序遍历的结果))