判断的后序遍历序列是否是二叉查找树
二叉查找树:如果左子树不为空,那么左子树上的所有节点都小于根节点;
如果右子树不为空,那么又子树上的所有节点都大于根节点;
左右子树也是二叉排序树。
在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:
- (1)第一部分是左子树结点的值,它们都比根结点的值小
- (2)第二部分是右子树结点的值,它们都比根结点的值大
- (3)递归左子树
- (4)递归右子树
代码:
public class BinarySearchTrees { //有序遍历结果的特点是,最后一个元素是根元素,根据这个根元素会把其他的子序列按照大小分成两个部分, //最后递归地对这两个子序列分别进行上述操作 public static bool VerifyBST() { int[] array = { 5,7,6,9,11,10,8}; return VerifyBST(array, 0, array.Length-1); } public static bool VerifyBST(int[] array, int start, int end) { if (start == end) return true; int root = array[end]; //遍历左子树 int left = start; while (left < end && array[left] < root) { left++; } left--; //遍历右子树 int right = left+1; while (right < end && array[right] > root) { if (array[right] < root) //右子树如果有小于根节点的,直接返回 return false; right++; } //递归左子树 bool leftRecurse = true; if (left - start > 0) { leftRecurse = VerifyBST(array, start, left); } //递归右子树 bool rightRecurse = true; if (end - left > 0) { rightRecurse = VerifyBST(array, left, end); } return leftRecurse&&rightRecurse; } }