【C/C++练习题】二叉搜索树的后序遍历序列

本文介绍了一种算法,用于判断给定的整数数组是否为二叉搜索树的后序遍历结果。通过递归地检查每个子树的节点值,确保它们符合二叉搜索树的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《剑指Offer》面试题33:二叉搜索树的后序遍历序列

 


1 题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

 

2 思路

二叉搜索树的所有左子树节点都小于等于根节点,所有右子树节点都大于等于根节点。而后序遍历的优先遍历顺序是,左子节点->右子节点->根节点。

那么,将序列分成左子树节点、右子树节点、根节点三个部分,取序列中最后一个元素为当前二叉树的根节点,在判断左右区间中的节点是否满足搜索二叉树的定义,如果满足就对剩下的左右区间进行递归,否则返回false。当递归至树中只有一个节点的时候,返回true。

 

3 代码

/*
*********************************************************************************************************
*
* 模块名称 : 主程序
* 文件名称 : demo.cpp
* 版    本 : V1.0
* 说    明 : 《剑指Offer》笔试题,确定二叉搜索树的后序遍历序列
*
* 修改记录 :
*  版本号	日期        	作者 	说明
*  V1.0		2019-08-13 	hinzer  正式发布
*
* 码云链接:
*
*********************************************************************************************************
*/

#include "iostream"
#include "cstdlib"

using namespace std;


typedef struct Node
{
	int m_nValue;
	Node* m_pLeft;
	Node* m_pRight;
}BinaryTreeNode;	


/******************************************************************************
* 函数介绍:确定为二叉搜索树的后序遍历序列
* 输入参数:array待判断的数组序列, length序列长度
* 输出参数:无
* 返回值:true 成功 , false 传入参数无效
* 备注:无
******************************************************************************/
bool Is_squence_of_BST(const int* array, int length)
{	
	//判断无效输入参数
	if (NULL == array || length <= 0)
		return false;

	//1.递归算法-回归条件
	if (length == 1)
	{
		return true;
	}

	//2.根据二叉搜索树的规则,判断左子树区间和右子树区间
	int i = 0;	//
	while (!(array[i] <= array[length-1] && array[length-1] <= array[i+1]))
	{
		++i;
		//防止数组越界
		if (i == length-1)
			return false;
	}

	//3.判断左子树节点 <= 根节点 <= 右子树节点
	int j = 0;
	for (j = 0;j <= i;++j)
	{//对左子树节点进行判断
		if (array[j] > array[length-1])	
			return false;
	}
	for (j = i+1;j <= length-2;++j)
	{//对右子树节点进行判断
		if (array[j] < array[length-1])	
			return false;
	}

	//4.递归算法-递推公式
	return (Is_squence_of_BST(&array[0], i+1) && Is_squence_of_BST(&array[i+1], length-i-2));
}




/******************************************************************************
* 函数介绍:功能测试函数
* 输入参数:无
* 输出参数:无
* 返回值:无
* 备注:无
******************************************************************************/
void test01()
{
	int array1[] = {5, 7, 6, 9, 11, 10, 8};
	int array2[] = {7, 4, 6, 5};

	if (Is_squence_of_BST(array1, sizeof(array1)/sizeof(int)))
	{
		cout << "array1 is correct" << endl;
	}
	if (Is_squence_of_BST(array2, sizeof(array2)/sizeof(int)))
	{
		cout << "array2 is correct" << endl;
	}

}


int main(int argc, char const *argv[])
{
	test01();
	return 0;
}

 

4 运行

 

 

5 算法改进

bool Is_squence_of_BST(const int* array, int length)
{	
	//判断无效输入参数
	if (NULL == array || length <= 0)
		return false;

	//1.递归算法-回归条件
	if (length == 1)
	{
		return true;
	}

	//2.根据二叉搜索树的规则,判断左子树区间和右子树区间
	int i = 0;
	for (i = 0;i < length-1;++i)
	{//搜索二叉树中,左子树节点小于根节点
		if (array[i] > array[length-1])	
			break;
	}

	int j = 0;
	for (j = i;j < length-1;++j)
	{//搜索二叉树中,右节点的值大于根节点
		if (array[j] < array[length-1])	
			return false;
	}

	//3.递归算法-递推公式
	return (Is_squence_of_BST(&array[0], i) && Is_squence_of_BST(&array[i], length-i-1));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hinzer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值