二叉查找树:如果左子树不为空,那么左子树上的所有节点都小于根节点;
如果右子树不为空,那么又子树上的所有节点都大于根节点;
左右子树也是二叉排序树。
在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:
- (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;
}
}