二叉搜索树的后续遍历

给定一个整型数组,判断这个数组是否可能是一棵二叉搜索树后续遍历的结果?

由于二叉搜索树的特性,任何一个节点它的左子树中的节点都比这个节点值小,右子树中的节点都比这个节点值大,那么经过后续遍历后的数组应该有一个特性,就是数组中前面一部分元素比最后一个元素值小,后面那部分元素值都比最后一个元素值大。并且前面这部分元素和后面这部分元素也符合同样的规律,根据这个特性,可以用递归求解。

如下图:

代码如下:

#include "util.h"

/*二叉搜索树的后续遍历
 * 输入一个数组,判断该数组中的元素是否是一棵二叉搜索数的后续遍历的结果
 */

/*由于二叉树的特性,任何一个节点的左子树中的节点都比这个节点值小,右子树中的节点值都比当前值大
 * 而且由于后续遍历根节点是最后访问的,那么可以根据最后这个值找到数组中哪些节点是它的左子树的节点,
 * 哪些节点是它的右子树的节点*/
//如果能够形成二叉树的后续遍历,返回true,否则返回false
bool binarySearchTreePost(int *datas,int begin,int end)
{
	//如果输入数据1效,返回false
	if(datas==NULL||begin>end) return false;

	//如果begin和end相等,表示只有一个节点,一个节点可以认为是二叉搜索树
	if(begin==end) return true;

	int next=begin;

	//left这个下标用来记录左子树最后节点的索引
	int left=begin;
	for(;next<end;next++)
	{
		//找到第一个大于datas[end]的节点,那么这个节点之前的所有节点应该是左子树中的节点,这个节点和它之后的节点是右子树中的节点
		if(datas[next]>datas[end])
		{
			break;
		}

	}
	left=next-1;

	//右子树中的节点应该都大于这个datas[end]如果不满足要求,返回false
	for(;next<end;next++)
	{
		if(datas[next]<datas[end])
				return false;
	}

	bool leftFlag,rightFlag;
	leftFlag=rightFlag=true;

	//只有当左子树中最少有一个元素时才需要继续遍历
	if(left>=begin)
		leftFlag=binarySearchTreePost(datas,begin,left);

	//只有当右子树中最少有一个元素时才需要遍历
	if(left<end-1)
		rightFlag=binarySearchTreePost(datas,left+1,end-1);

	return leftFlag&&rightFlag;
}

int main()
{
	int num[]={5,7,6,9,11,10,8};
	bool flag=binarySearchTreePost(num,0,sizeof(num)/sizeof(num[0])-1);
    const char * output=flag?"true":"false";
	std::cout<<"二叉搜索树的后序遍历:"<<std::endl;
	printArrayT(num,sizeof(num)/sizeof(num[0]));
	std::cout<<output <<std::endl;
	int num1[]={1,2,3,4,5,6};
	flag=binarySearchTreePost(num1,0,sizeof(num1)/sizeof(num[0])-1);
	output=flag?"true":"false";
	printArrayT(num1,sizeof(num1)/sizeof(num1[0]));
	std::cout<<output<<std::endl;
	return 0;

}
时间: 2024-08-10 22:01:05

二叉搜索树的后续遍历的相关文章

剑指offer:二叉搜索树的后续遍历序列

题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路: 根据二叉搜索的性质,后序遍历是先搜索左子树,再右子数,最后是根结点.对应到序列中就是,序列的最后一位为根结点,从头开始遍历序列中一段连续子序列小于根结点,为左子树,后一段连续子序列大于根结点,为右子树. 举个例子,序列为(2,4,3,6,7,5),则5为根结点,对应(2,4,3)都小于5,为左子树,(6,7)大于5,为右子树.再对每个

剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果.如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false. 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根节点的值

二叉搜索树的遍历

------------------siwuxie095 二叉搜索树的遍历 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

PTA 7-28 搜索树判断(镜像二叉搜索树的后序遍历)

算法源代码在 Veeupup Github 考点: 二叉搜索树遍历方式和性质运用 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列. 输入格式: 输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

二叉搜索树的后序遍历判断

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public c

二叉搜索树的插入

--------------------siwuxie095 二叉树的插入 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

二叉搜索树的删除

-------------------siwuxie095 二叉搜索树的删除 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; N

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所