《剑指offer》:[24]判断一个序列是否为二叉树的后序遍历序列
2016-06-09 21:18
537 查看
题目:输入一个整数,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否返回false。假设输入的数字互不重复。
在后续遍历中,最后一个数字是根结点,将数组中的数字分为两部分:第一部分是左子树的值,它的值都比根结点小;另一部分是右子树的值,它的值都比根结点大;
以上面的二叉树为例:后续遍历[3,6,4,10,14,12,8]的最后一个结点是8,所以在这个数组中,3,6,4都比8小时该数的左子树;而10,14,12都比8大,是该树的右子树。我们以同样的方法来分析其左子树和右子树3,6,4,其中4将左子树分为3和6两部分;12将右子树10和14分为两部分。所以这个序列就是一个后续遍历序列。但是[7,4,5,6]就不是它的一个后续遍历序列。因为6大于7,所以也就是说7,4,5都是其右子树,但是很不幸还有4比6小,所以不可能是一个后续遍历。
具体实现代码如下:
运行结果:
小结:不管是分析是否是前序还是后续,我们都可以先找到二叉树的根结点,再基于根结点将整棵树拆分为左子树和右子树序列。接下来再递归处理两个子序列即可。
采用“分治法”的思想,解决这样的问题。
在后续遍历中,最后一个数字是根结点,将数组中的数字分为两部分:第一部分是左子树的值,它的值都比根结点小;另一部分是右子树的值,它的值都比根结点大;
以上面的二叉树为例:后续遍历[3,6,4,10,14,12,8]的最后一个结点是8,所以在这个数组中,3,6,4都比8小时该数的左子树;而10,14,12都比8大,是该树的右子树。我们以同样的方法来分析其左子树和右子树3,6,4,其中4将左子树分为3和6两部分;12将右子树10和14分为两部分。所以这个序列就是一个后续遍历序列。但是[7,4,5,6]就不是它的一个后续遍历序列。因为6大于7,所以也就是说7,4,5都是其右子树,但是很不幸还有4比6小,所以不可能是一个后续遍历。
具体实现代码如下:
#include <iostream> using namespace std; struct BinartyTree { int data; BinartyTree *pLeft; BinartyTree *pRight; }; BinartyTree *pRoot1=NULL; int arr2[7]={5,6,4,10,14,12,8};//YES int arr3[7]={5,6,4,10,12,7,8}; //NO bool VerifySequenceOfBST(int *array,int length) { if(NULL==array || length<=0) return false; int root=array[length-1]; int i=0;//左子树的结点小于根节点; for(;i<length-1;i++) { if(array[i]>root) break;//找完了全部的左子树的序列; } int j=i;//右子树的结点大于根结点; for(;j<length-1;j++) { if(array[j]<root) return false; } bool left=true; if(i>0) left=VerifySequenceOfBST(array,i); bool right=true; if(j<length-1) right=VerifySequenceOfBST(array+i,length-i-1); return left && right; } int main() { if(VerifySequenceOfBST(arr2,7)) cout<<"YES!"<<endl; else cout<<"NO"<<endl; if(VerifySequenceOfBST(arr3,7)) cout<<"YES!"<<endl; else cout<<"NO"<<endl; system("pause"); return 0; }
运行结果:
小结:不管是分析是否是前序还是后续,我们都可以先找到二叉树的根结点,再基于根结点将整棵树拆分为左子树和右子树序列。接下来再递归处理两个子序列即可。
采用“分治法”的思想,解决这样的问题。
相关文章推荐
- 《CSS权威指南》学习记录——颜色和背景
- 《JavaScript学习笔记》:Ajax的应用
- CSS---解决浏览器兼容性
- html5实现本地图片预览功能
- 《剑指offer》:[23]从上往下打印二叉树
- 解决引入JS中文乱码问题
- 剑指offer(四十六)之树的子结构
- Ajax过程 事件代理
- JavaScript Interview Questions: Event Delegation and This
- 滚动条样式
- 丑数
- [Nutch]Hadoop动态增加DataNode节点和TaskTracker节点
- leetcode 19. Remove Nth Node From End of List
- CSS---利用伪类绘制倒三角形
- (转载)Bootstrap 栅格系统的精妙之处
- fastJSON使用(一)——对象转换成json
- html插入图片后在网页显示不出来
- 前端学习_Series1_02.CSS3新增知识
- 获取元素CSS值之getComputedStyle方法熟悉
- HTML元素的宽度计算