二叉搜索树的后序遍历序列
1、题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入数组的任意两个数字都不相同。
输入参数:一个整数数组,数组长度
输出结果:true 或者 false
2、解题
这道题的关键在于在只给定一个序列的前提下,如何确定左右子树之间的界限。
由于题目的要求是二叉搜索树,所以这个界限的划分很简单,小于根节点的元素在左子树,大于根节点的元素在右子树。代码的具体核心步骤如下:
- 鲁棒性检查
- 找出根节点
- 在数组中找到左右子树分割的界限
- 在右子树中对序列的正确性进行判断
- 递归遍历左右子树,直到全部遍历完
- 返回左右子树判断正确性的结果
3、完整代码
bool VerifySequenceOfBST(int sequence[], int length) {
//1、鲁棒性检查
if (sequence == nullptr || length <= 0)
return false;
//2、找出根节点
int rootValue = sequence[length - 1];
//3、在数组中找到左右子树分割的界限
int i = 0;
for (; i < length - 1; i++) {
if (sequence[i] > rootValue)
break;
}
int j = i;
for (; j < length - 1; j++) {
//4、在右子树中对序列的正确性进行判断
//如果在右子树出现某个节点的值小于根节点,则错误
if (sequence[j] < rootValue)
return false;
}
//5、递归遍历左右子树,直到全部遍历完
bool left = true;
if (i > 0)
left = VerifySequenceOfBST(sequence, i);
bool right = true;
if (i < length - 1)
right = VerifySequenceOfBST(sequence + i, length - i - 1);
//6、返回左右子树判断正确性的结果
return (left && right);
}
4、二叉搜索树
定义
二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
特点
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。
其应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
结构
二叉搜索树是能够高效地进行如下操作的数据结构。
-
插入一个数值
-
查询是否包含某个数值
-
删除某个数值
5、注意点
- 判断左右子树是否不为空时,都是使用
i
进行判断,尤其是右子树,用i < length - 1
进行判断 - 找出左子树,在右子树中进行正确性判断
- 递归调用时脑袋里要有数组的意象,注意到sequence数组是从0开始