二叉搜索树的后序遍历序列 【微软面试100题 第九题】
2014-10-27 19:37
387 查看
题目要求:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个证书序列时某一二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序遍历的结果是这个序列,因此返回false。
8
/ \
6 10
/ \ / \
5 7 9 11 后序遍历序列[b]5,7,6,9,11,10,8对应的二叉搜索树[/b]
[b]参考资料:剑指offer第24题[/b]
题目分析:
1.二叉搜索树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为[b]二叉搜索树。[/b]
2.后序遍历:左+右+根
3.解决思路:假设数组有n个元素,取数组的最后一个元素a[n-1],把前n-1个元素分成左右两部分,左部分小于a[n-1],右部分大于a[n-1](可以左部分没有或者右部分没有).然后左部分和右部分分别用此思路递归的处理。如果中途出现不能分成左右部分的情况,则说明该数组不是后序遍历结果。
如[b]{5,7,6,9,11,10,8},取最后一个元素8,可以分成左部分{5,7},右部分{[b][b]9,11,10[/b]}。[/b]
[/b]
[b] 但是[b]{7,4,6,5},取最后一个元素5,因为7>5,则如果可以划分的话,7后面的元素都应该大于5,但是4<5,即该数组不是某二叉搜索树的后序遍历结果。
[/b][/b]
[b][b]代码:[/b][/b]
View Code
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个证书序列时某一二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序遍历的结果是这个序列,因此返回false。
8
/ \
6 10
/ \ / \
5 7 9 11 后序遍历序列[b]5,7,6,9,11,10,8对应的二叉搜索树[/b]
[b]参考资料:剑指offer第24题[/b]
题目分析:
1.二叉搜索树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为[b]二叉搜索树。[/b]
2.后序遍历:左+右+根
3.解决思路:假设数组有n个元素,取数组的最后一个元素a[n-1],把前n-1个元素分成左右两部分,左部分小于a[n-1],右部分大于a[n-1](可以左部分没有或者右部分没有).然后左部分和右部分分别用此思路递归的处理。如果中途出现不能分成左右部分的情况,则说明该数组不是后序遍历结果。
如[b]{5,7,6,9,11,10,8},取最后一个元素8,可以分成左部分{5,7},右部分{[b][b]9,11,10[/b]}。[/b]
[/b]
[b] 但是[b]{7,4,6,5},取最后一个元素5,因为7>5,则如果可以划分的话,7后面的元素都应该大于5,但是4<5,即该数组不是某二叉搜索树的后序遍历结果。
[/b][/b]
[b][b]代码:[/b][/b]
#include <iostream> using namespace std; bool verify(int *a,int len); int main(void) { // int a[] = {5,7,6,9,11,10,8}; int a[] = {7,4,6,5}; int len = sizeof(a)/sizeof(int); if(verify(a,len)) cout << "该数组是某二叉搜索树的后序遍历序列" << endl; else cout << "该数组不是任何二叉搜索树的后序遍历序列" << endl; return 0; } bool verify(int *a,int len) { if(a==NULL || len<=0) return false; int root = a[len-1]; //在二叉搜索树中左子树的结点小于根结点 int i = 0; for(;i<len-1;i++) { if(a[i]>root) break; } //在二叉搜索树中右子树的结点大于根结点 int j = i; for(;j<len-1;j++) { if(a[j]<root) return false; } //判断左子树是不是二叉搜索树 bool left = true; if(i>0) left = verify(a,i); //判断右子树是不是二叉搜索树 bool right = true; if(i<len-1) right = verify(a+i,len-i-1); return left&&right; }
View Code
相关文章推荐
- 二叉搜索树的后序遍历序列 【微软面试100题 第九题】
- 面试24:二叉搜索树的后序遍历序列
- 剑指offer-4-面试24:二叉搜索树的后序遍历序列
- 微软100题第9题(判断整数序列是不是二元查找树的后序遍历结果)
- 面试100题:9.判断整数序列是不是二元查找树的后序遍历结果
- 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ
- 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ
- 剑指offer--二叉搜索树的后序遍历序列
- 最长递减子序列 【微软面试100题 第四十七题】
- 剑指Offer面试题33:二叉搜索树的后序遍历序列
- 剑指Offer----面试题24:二叉搜索树的后序遍历序列
- 剑指Offer系列---(26)二叉搜索树的后序遍历序列
- 【剑指Offer_在线编程】 【牛客网22题:二叉搜索树的后序遍历序列】
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列 (剑指Offer 第 22 题)
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列