`

判断一个数组是不是排序二叉树后序遍历

阅读更多

碰到一个题目,判断一个数组是不是排序二叉树的后序遍历,所谓排序二叉树,指的是对于二叉树中的根节点比左子节点数值大,同时比右子节点数值小,例如[5,7,6,9,11,10,8] 就是一个排序二叉树的后序遍历,而[7,10,8,9]则不是

 

解题思维:

既然是后序遍历,则数组最后一个数值肯定是根节点,而从左到右,剩下数组元素的左侧值肯定小于根节点值,而其余的数组元素则大于根节点,例如[5,7,6,9,11,10,8]这个数组,8肯定是根节点,而从数组左侧到5~6三个数比8小,肯定是左子树,而剩下的9~10应该就是右子树,右子树应该满足每个数字都比根节点大,如果满足的话,我们再把[5,7,6]和[9,11,10]两个部分的数组元素重复进行之前的操作,知道结束

 

按照这个思路分析一下[7,10,8,9]为什么不是,首先9为根节点,从数组左侧找到比8小的元素组,该元素组的最后一个元素是7,因此,左子树应该是7,而剩下的[10,8,9]应该是右子树,右子树应该满足的条件是每个数字都比根节点9大,然而8比9小,所以不满足

 

了解这点的话可以写出如下程序

/*
author:luchi
date:2015/10/21 
*/ 
#include<iostream>
using namespace std;
//判断函数 
bool isValidate(int a[],int begin,int end){
	
	//如果begin>=end表示待分析的数组元素部分只有一个值或者没有值,返回true 
	if(begin>=end) return true;
	//找到根节点 
	int root=a[end];
	int i=begin;
	//找到最后一个比根节点小的元素位置 
	while(a[i]<=root){
		i++;
	}
	int seperator=i;
	//递归判断左边是不是满足 
	bool isLeftValidate=(a,begin,seperator-1);
	
	bool isRightValidate=true;
	//判断右边节点是不是比根节点大,如果不是的话,表示右边不满足,返回false 
	for(int j=seperator;j<=end-1;j++){
		if(a[j]<root){
			isRightValidate=false;
			break;
		}
	}
	//如果右边满足当前的根节点的话,则递归判断剩下的右边元素是不是满足 
	if(isRightValidate){
		isRightValidate= isValidate(a,seperator,end-1);
	}
	//只有左边和右边都满足了才返回true 
	return (isLeftValidate && isRightValidate) ;
	
}
int main(){
	

	int a[7]={5,7,6,9,11,10,8};
//	int a[4]={7,4,6,5};
	bool isRight=isValidate(a,0,7);
	if(isRight){
		cout<<"right"<<endl;
	}else{
		cout<<"wrong"<<endl;
	}
	return 0;
} 

 

2
1
分享到:
评论

相关推荐

    排序二叉树前序中序后序遍历

    例如,如果我们有一个数组[4, 2, 5, 1, 3],我们可以按顺序插入这些元素来构建排序二叉树。首先,4作为根节点,接着2插入到4的左侧,5插入到4的右侧,1插入到2的左侧,3插入到2的右侧。这样,我们就得到了一个完整的...

    自己编写的实验二叉树的后序遍历非递归算法c语言实现

    这个实验中,我们主要关注的是如何用C语言实现非递归的二叉树后序遍历。首先,我们需要理解非递归实现的基本思路。不同于递归方法直接利用函数调用栈,非递归方式需要我们自己管理一个辅助栈,将节点按照一定的顺序...

    二叉树的操作 建立 删除 中序,先序 后序遍历

    - **静态建立**:在已知所有节点的情况下,可以通过预先定义一个数组或结构体数组来构建二叉树。 2. **二叉树的删除** - **简单删除**:如果待删除节点没有子节点,直接删除即可。 - **有子节点的删除**:当待...

    后序遍历该二叉树的非递归算法

    ### 后序遍历该二叉树的非递归算法 #### 1. 理解题目背景 在计算机科学中,二叉树是一种常用的数据结构。它具有丰富的应用场景,如搜索、排序等。二叉树可以有多种遍历方式,包括前序遍历、中序遍历和后序遍历。...

    《数据结构》二叉树建立、前中后序遍历、及节点查找

    前中后序遍历是理解二叉树结构和性质的关键,而节点查找则涉及到二叉树的实际应用,如搜索和排序。通过学习这些基本操作,可以为后续的高级数据结构和算法打下坚实的基础。在实际编程中,可以根据具体需求选择合适的...

    二叉树建立遍历

    本主题主要关注的是二叉树的建立以及它的遍历方法——中序遍历和后序遍历。 首先,我们需要理解如何建立二叉树。二叉树的建立通常有两种方式:一种是通过序列化数据(如字符串或数组)来构建,另一种是动态创建。...

    c语言上机上机 二叉树的遍历 链表建立

    在链表中,每个元素称为节点,每个节点包含数据和指向下一个节点的指针。`LINK.C`可能包含了创建链表、插入节点、删除节点以及遍历链表等操作的代码。链表的建立通常包括定义节点结构、初始化链表和插入新节点等步骤...

    二叉树的遍历及其应用.docx

    例如,通过先序和中序遍历序列可以重建二叉树,这是因为在先序遍历中第一个元素是根节点,在中序遍历中根节点将左子树和右子树分开。此外,遍历还能用于查找、插入和删除操作,特别是在二叉搜索树中。 在实际问题中...

    数据结构实例&二叉树建立遍历冒泡排序

    1. 选择一个基准值(pivot),将数组分为两部分:小于基准的元素和大于基准的元素。 2. 分别对这两部分进行快速排序,递归地重复第一步和第二步,直到所有元素都在正确的位置。 虽然冒泡排序易于理解,但其时间...

    排序二叉树的建立和遍历

    `creat`函数用于构建一个完整的排序二叉树,它接受一个整型数组和数组长度作为参数,依次将数组中的元素插入到树中。 #### 三、遍历排序二叉树 遍历是访问树中所有节点的过程。常见的遍历方式有前序遍历、中序遍历...

    java 实现的二叉树前序建树,中序建树,后序建树以及前序遍历,中序遍历和后序遍历的代码

    假设我们有一个字符串数组,其中每个元素代表一个节点的值,如`["1", "2", "3", null, "4"]`,可以按照以下方式创建二叉树: ```java public TreeNode buildTree(String[] preorder) { return buildTree(preorder,...

    数据结构二叉树遍历 图的遍历 排序算法

    Hoare提出的高效排序算法,采用分治策略,以一个元素为基准,将数组分为两部分,一部分所有元素小于基准,另一部分所有元素大于基准,再分别对这两部分进行排序。 5. **堆排序**:基于堆数据结构的排序,将待排序的...

    基于C语言的实例二叉树建立遍历冒泡排序快速排序源码.zip

    它采用分治策略,选择一个基准元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于基准,然后对这两部分再分别进行快速排序。快速排序的平均时间复杂度为O(n log n),最坏情况下的时间...

    10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等.zip

    它的基本思想是采用分治法,选择一个基准元素,将数组分为两部分,一部分的所有元素都比基准小,另一部分的所有元素都比基准大,然后对这两部分继续进行快速排序,直到所有元素排序完毕。快速排序平均时间复杂度为O...

    C语言实现二叉树的前序遍历(非递归)

    值得注意的是,代码中使用了一个固定的大小为100的数组作为栈,这可能限制了处理较大二叉树的能力。在实际应用中,可以考虑使用动态分配的链式栈以提高灵活性。 ### 测试数据示例 给定的数据提供了前序创建二叉树...

    毕业答辩-10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等.rar

    遍历二叉树包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根),这些方法对于理解二叉树的结构和操作至关重要。 其次,"建立"二叉树的过程可能涉及到从序列化数据(如以特定格式存储的字符串或...

    10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等下载.zip

    它的基本思想是采用分治法,选取一个基准元素,将数组分成两部分,一部分的元素都比基准小,另一部分的元素都比基准大,然后再对这两部分进行快速排序。快速排序的平均时间复杂度为O(n log n),在实际应用中表现出色...

    建一棵二叉树,并分别用先序和中序遍历二叉树

    1. **定义节点结构**:在编程中,我们需要定义一个结构来表示二叉树的节点,通常包括数据部分(例如整数)和两个指针,分别指向左子节点和右子节点。例如,在Python中,可以定义如下: ```python class TreeNode: ...

    数据结构算法__背诵篇

    合并两个已排序链表为一个新有序链表,比较两链表头部节点大小,选择较小者链接到新链表,直至一个链表遍历完,将另一个链表剩余部分链接到新链表尾部。 ```c LinkList MergeList(LinkList lista, LinkList listb) ...

Global site tag (gtag.js) - Google Analytics