剑指offer面试题之判断二叉搜索树的后序序列
2016-04-02 18:26
399 查看
1,问题:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2,想法:
后序序列的最后一个结点为根节点,根节点的左孩子树都比它小,右孩子树都比它大,所以可以根据最后一个结点把序列分成两个部分,分成两个部分后又可以继续递归判断。而递归的出口是,当递归到序列中只有一个孩子时,返回true,当当前根节点不能把当前序列分成两个部分时,就返回false。
3,编码:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2,想法:
后序序列的最后一个结点为根节点,根节点的左孩子树都比它小,右孩子树都比它大,所以可以根据最后一个结点把序列分成两个部分,分成两个部分后又可以继续递归判断。而递归的出口是,当递归到序列中只有一个孩子时,返回true,当当前根节点不能把当前序列分成两个部分时,就返回false。
3,编码:
class Solution { public: bool isBST(vector<int> s, int start, int end) { if (start == end)//序列只有一个孩子时 { return true; } int i; //下边两个for循环既可以判断当前的根能否完整的把序列分成两个左右孩子序列 //从而判断是否是后序序列 //又能找到下层递归的起始位置 for (i = start; i < end;) { if (s[i] < s[end]) i++; else break; } for (i; i < end;) { if (s[i] > s[end]) i++; else break; } if (i < end)//这里判断是否在找到第一个大于根的节点后,序列中又有小于根的节点 { //若有则i不回增加到end,就不是一个后序序列 return false; } if (i - start == 0)//说明当前后序序列代表的树没有左孩子 { return isBST(s, start, end - 1); } else if (i == end)//表示没有右孩子 { return isBST(s, start, end - 1); } else { return isBST(s, start, i - 1) && isBST(s, i, end - 1); } } bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.empty()) { return false; } return isBST(sequence, 0, sequence.size() - 1); } };
相关文章推荐
- ssh面试题
- 【笔试/面试】—— 序列全排列(递归版)
- 招人与面试
- 剑指offer面试题之字符串的排列
- 剑指offer-面试题25:二叉树中和为某一值的路径
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 10年经验的.NET老程序员推荐的7个开发类工具
- 【操作系统】:操作系统常见面试题
- 码农小汪-ReentrantLock 可重入锁
- java面试题目 5
- 【剑指Offer学习】【面试题55:字符流中第一个不反复的字符】
- 面试题思考:Stack和Heap的区别
- 码农小汪-锁 LOCK
- 程序员必知的10大基础实用性算法
- 码农小汪-synchronized
- 单链表常见面试题
- 软件应该使用中文版还是外文版
- 剑指 offer代码解析——面试题39判断平衡二叉树
- 剑指 offer代码解析——面试题39判断平衡二叉树