面试题整理7 二叉搜索树的后序遍历序列
《剑指offer》面试题24:
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
分析: 分析输入是整数数组,而不是整数数组和二叉树,所以不是说后序遍历一下二叉树与数组数组比较来判断是否是此二叉树的后序遍历序列。
而是判断输入的整数数组是否是某一课二叉树的后序遍历序列的结果,如输入数组为{4, 8, 6, 12, 16, 14, 10},则返回true,因为序列是如下图数的后序遍历结果;
而输入数组{7, 4, 6, 5},则由于没有二叉树与此序列对应,则返回false。
由于后序遍历得到的序列中,最后一个数字是二叉树的根结点的值。数组前面的数字可以分成两部分:左子树部分和右子树部分。左子树的数据值都小于根结点的值,右字数的数据值都大于根结点的值。采用递归的方法,从头扫描序列找到第一个大于根结点值的数,此数之前的值都为左子树部分,此数之后到最后一个数字前都是右子树部分,如果右子树部分出现小于根结点值的值则不符合规则,即返回false。否则递归左右子树。
(1) 自己写的代码:注意当查找的序列只有一个或者两个时,肯定是某个二叉树的后序序列;当查找的序列三个及以上时,查找到分割点时需要判断分割点的值,注意不要越界。
bool IsPostTraverseOfBST(const int sequence[], int length)
{if(sequence == NULL || length <= 0)return false;return IsPostTraverseOfSubBST(sequence,0,length-1);}
bool IsPostTraverseOfSubBST( const int sequence[], int start, int end )
{if( end - start <0 ){return false;}//only 1 or 2 elementsif( end - start <= 1){return true;}int rootData = sequence[end];int index = start;// find the left subtreefor( ; index <= end-1; ++index ){if( sequence[index] > rootData ){break;}}// find the right subtree int midIndex = index++ ;for( ; index<=end-1; ++index ){if( sequence[index]<rootData ){return false;}}bool isLeft = true;if( midIndex > 0 ){isLeft = IsPostTraverseOfSubBST( sequence,start, midIndex-1);}bool isRight = true;if( midIndex < end ){isRight = IsPostTraverseOfSubBST( sequence,midIndex,end-1 );}return isLeft&&isRight;
}
(2)附上《剑指offer》中示例代码
bool VerifySquenceOfBST(int sequence[], int length)
{if(sequence == NULL || length <= 0)return false;int root = sequence[length - 1];// 在二叉搜索树中左子树的结点小于根结点int i = 0;for(; i < length - 1; ++ i){if(sequence[i] > root)break;}// 在二叉搜索树中右子树的结点大于根结点int j = i;for(; j < length - 1; ++ j){if(sequence[j] < root)return false;}// 判断左子树是不是二叉搜索树bool left = true;if(i > 0)left = VerifySquenceOfBST(sequence, i);// 判断右子树是不是二叉搜索树bool right = true;if(i < length - 1)right = VerifySquenceOfBST(sequence + i, length - i - 1);return (left && right);
}
面试题整理7 二叉搜索树的后序遍历序列相关推荐
- 剑指offer——面试题24:二叉搜索树的后序遍历序列
剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...
- 【剑指offer】面试题33:二叉搜索树的后序遍历序列(Java)
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树: 5 / \ ...
- 【剑指offer】面试题33:二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个数字都互不相同. 代码: package offer; public ...
- 剑指offer:面试题33. 二叉搜索树的后序遍历序列
题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜 ...
- [剑指offer] 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 P157 题目:输入一个数组,判断这个数组是不是一个二叉搜索树的后序遍历的结果. solution:我们知道后序遍历序列的最后一个item是根节点,如果确实是二叉搜索树的后序 ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- C#刷剑指Offer | 二叉搜索树的后序遍历序列
[C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第289篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 剑指offer——二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这里遇到的问题就是,传递的子数组怎 ...
最新文章
- 计算机组成原理实验认识多思网络虚拟实验系统_3D全息投影,裸眼3D,全息互动投影系统...
- 英语发音规则---发/i:/的字母及字母组合
- php mvc和mvvm,mvvm模式和mvc模式的区别是什么
- 并发请求数_nginx如何限制并发连接和请求数?
- 洛谷-DFS-1019-单词接龙-个人AC题解和公共AC题解笔记
- java中几种基本数据类型之间的转换
- ssh-copy-id password
- laravel nginx配置_nginx高可用
- ScrollView中嵌套recycleView 出现的不显示,显示不全,终极解决方案
- js获取 当前URL中的参数
- 板簧的弹性系数如何计算_滑板式钢板弹簧悬架变刚度计算方法的研究
- 大数据行业现在工作好不好找?很难吗?
- CNN应用之性别、年龄识别
- ValueError: y contains previously unseen labels: ‘103125‘
- Italvibras M3/4-S02振动电机M3/20-S02 3/100-S02 3/200-S02 MVSI 3/300-S02振动电机
- 不看别后悔,关于小儿夜啼、踹被、食欲差和积食,虫妈原创,55首发
- RHCE 7.0 考试命令整理
- 使用WinDbg —— .NET篇 (一)
- Redis 如何实现库存扣减操作和防止被超卖?
- Power Query (Power BI)傻瓜式合并资产负债表,史上最好用