碰到一个题目,判断一个数组是不是排序二叉树的后序遍历,所谓排序二叉树,指的是对于二叉树中的根节点比左子节点数值大,同时比右子节点数值小,例如[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; }
相关推荐
例如,如果我们有一个数组[4, 2, 5, 1, 3],我们可以按顺序插入这些元素来构建排序二叉树。首先,4作为根节点,接着2插入到4的左侧,5插入到4的右侧,1插入到2的左侧,3插入到2的右侧。这样,我们就得到了一个完整的...
这个实验中,我们主要关注的是如何用C语言实现非递归的二叉树后序遍历。首先,我们需要理解非递归实现的基本思路。不同于递归方法直接利用函数调用栈,非递归方式需要我们自己管理一个辅助栈,将节点按照一定的顺序...
- **静态建立**:在已知所有节点的情况下,可以通过预先定义一个数组或结构体数组来构建二叉树。 2. **二叉树的删除** - **简单删除**:如果待删除节点没有子节点,直接删除即可。 - **有子节点的删除**:当待...
### 后序遍历该二叉树的非递归算法 #### 1. 理解题目背景 在计算机科学中,二叉树是一种常用的数据结构。它具有丰富的应用场景,如搜索、排序等。二叉树可以有多种遍历方式,包括前序遍历、中序遍历和后序遍历。...
前中后序遍历是理解二叉树结构和性质的关键,而节点查找则涉及到二叉树的实际应用,如搜索和排序。通过学习这些基本操作,可以为后续的高级数据结构和算法打下坚实的基础。在实际编程中,可以根据具体需求选择合适的...
本主题主要关注的是二叉树的建立以及它的遍历方法——中序遍历和后序遍历。 首先,我们需要理解如何建立二叉树。二叉树的建立通常有两种方式:一种是通过序列化数据(如字符串或数组)来构建,另一种是动态创建。...
在链表中,每个元素称为节点,每个节点包含数据和指向下一个节点的指针。`LINK.C`可能包含了创建链表、插入节点、删除节点以及遍历链表等操作的代码。链表的建立通常包括定义节点结构、初始化链表和插入新节点等步骤...
例如,通过先序和中序遍历序列可以重建二叉树,这是因为在先序遍历中第一个元素是根节点,在中序遍历中根节点将左子树和右子树分开。此外,遍历还能用于查找、插入和删除操作,特别是在二叉搜索树中。 在实际问题中...
1. 选择一个基准值(pivot),将数组分为两部分:小于基准的元素和大于基准的元素。 2. 分别对这两部分进行快速排序,递归地重复第一步和第二步,直到所有元素都在正确的位置。 虽然冒泡排序易于理解,但其时间...
`creat`函数用于构建一个完整的排序二叉树,它接受一个整型数组和数组长度作为参数,依次将数组中的元素插入到树中。 #### 三、遍历排序二叉树 遍历是访问树中所有节点的过程。常见的遍历方式有前序遍历、中序遍历...
假设我们有一个字符串数组,其中每个元素代表一个节点的值,如`["1", "2", "3", null, "4"]`,可以按照以下方式创建二叉树: ```java public TreeNode buildTree(String[] preorder) { return buildTree(preorder,...
Hoare提出的高效排序算法,采用分治策略,以一个元素为基准,将数组分为两部分,一部分所有元素小于基准,另一部分所有元素大于基准,再分别对这两部分进行排序。 5. **堆排序**:基于堆数据结构的排序,将待排序的...
它采用分治策略,选择一个基准元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于基准,然后对这两部分再分别进行快速排序。快速排序的平均时间复杂度为O(n log n),最坏情况下的时间...
它的基本思想是采用分治法,选择一个基准元素,将数组分为两部分,一部分的所有元素都比基准小,另一部分的所有元素都比基准大,然后对这两部分继续进行快速排序,直到所有元素排序完毕。快速排序平均时间复杂度为O...
值得注意的是,代码中使用了一个固定的大小为100的数组作为栈,这可能限制了处理较大二叉树的能力。在实际应用中,可以考虑使用动态分配的链式栈以提高灵活性。 ### 测试数据示例 给定的数据提供了前序创建二叉树...
遍历二叉树包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根),这些方法对于理解二叉树的结构和操作至关重要。 其次,"建立"二叉树的过程可能涉及到从序列化数据(如以特定格式存储的字符串或...
它的基本思想是采用分治策略,选取一个基准值,将数组分为两部分,一部分的所有元素都比基准值小,另一部分的元素都比基准值大。然后对这两部分再进行快速排序,直到整个序列有序。 这些课程设计实例提供了实际操作...
它的基本思想是采用分治法,选取一个基准元素,将数组分成两部分,一部分的元素都比基准小,另一部分的元素都比基准大,然后再对这两部分进行快速排序。快速排序的平均时间复杂度为O(n log n),在实际应用中表现出色...
1. **定义节点结构**:在编程中,我们需要定义一个结构来表示二叉树的节点,通常包括数据部分(例如整数)和两个指针,分别指向左子节点和右子节点。例如,在Python中,可以定义如下: ```python class TreeNode: ...