判断整数序列是不是二元查找树的后序遍历结果

二叉查找树Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树。

Post Order : 先访问左节点, 再访问右节点,最后访问根节点。

 

分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。 

 

// IsPostOrderOfBinaSearchTree.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> bool isPostOrderOfBST(int iArray[], int size) { if(size <= 1 || iArray == NULL) return true; int end = iArray[size-1], middle = 0; for(;(middle < size-1) && (iArray[middle] < end); middle++); for(int i= middle + 1; i < size -1; i++) { if(iArray[i] < end) return false; } if(!(isPostOrderOfBST(iArray, middle))) return false; if(!(isPostOrderOfBST(iArray + middle, size-1-middle))) return false; return true; } int _tmain(int argc, _TCHAR* argv[]) { int iArrayTrue[7] = {5,7,6,9,11,10,8}; // ?1 init of array in c++ int iArrayFalse[4] = {7,4,6,5}; std::cout << isPostOrderOfBST(iArrayTrue, 7) << std::endl; std::cout << isPostOrderOfBST(iArrayFalse, 4) << std::endl; return 0; }

你可能感兴趣的:(c,tree,null,search)