剑指offer 编程题(22):二叉树后序遍历判断
2017-12-19 17:37
246 查看
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
对于后序遍历来说,序列数组的最后一个元素一定是根节点,
则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都小,右侧部分都大,如果右侧部分有比该根节点小的元素,那么就不是后序遍历,如此递归进行
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
对于后序遍历来说,序列数组的最后一个元素一定是根节点,
则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都小,右侧部分都大,如果右侧部分有比该根节点小的元素,那么就不是后序遍历,如此递归进行
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int sizeq = sequence.size(); if(sizeq == 0) { return false; } else if(sizeq == 1) { return true; } return search_seq(sequence,0,sizeq-1); } 4000 bool search_seq(vector<int> s,int start,int end) { if(start > end) { return true; } int i = start; while(s[i] < s[end]) { ++i; } for(int j=i;j<end;j++) { if(s[j] < s[end]) { return false; } } return search_seq(s,0,i-1) && search_seq(s,i+1,end-1); } };
相关文章推荐
- 剑指offer 编程题(16):判断是否子树
- 剑指Offer22 判断数组是否为某二叉搜索树的后序遍历
- 《剑指offer》:[22]如何判断一个序列是否为栈的弹出序列
- 【剑指offer系列】 栈的压入和弹出序列___22
- 一些简单的java编程题(10) ————判断完全平方数
- (剑指Offer)面试题22:栈的压入、弹出序列
- 剑指offer编程题——05 从头到尾打印链表
- 剑指offer 22题 【举例让抽象具体化】栈的压入、弹出序列
- 腾讯模拟笔试编程题--根据输入的点坐标判断是够能构成一个正方形
- 题目:JavaScript编程题 页面上输入一个年份(需验证),判断是否是闰年(能被4整除却不能被100整除的年份;能被400整除的是闰年),需在页面上显示提示信息
- 《剑指offer》:[34]丑数的判断与查找
- 剑指Offer—编程题31(连续子数组的最大和)
- 《剑指offer》-判断二叉树是否是平衡二叉树
- 2个小编程题(字节多少位为1,判断LSB or MSB)
- 剑指offer 18---输入两棵二叉树A和B,判断B是不是A的子结构
- 《剑指offer》编程题java实现(八):第一个只出现一次的字符
- 《剑指offer》编程题java实现(十二):连续子数组的最大和
- 面试题22 已知压入序列 判断弹出序列正不正确
- 《剑指offer》编程题java实现(二十八):二叉树的下一个节点
- 算法编程题-判断一颗树中是否有与另一棵树拓扑结构完全相同的子树