读书人

每日一算法(判断该数组是不是某二元查

发布时间: 2012-11-23 22:54:33 作者: rapoo

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

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回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);}



读书人网 >编程

热点推荐