二叉搜索树的后序遍历序列25
2016-06-13 21:32
323 查看
题目描述:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
解题思路:
后序遍历顺序:LRV(左、右、根结点)
后序遍历结果的最后一个数字是根节点。
根据第2节点及二叉搜索树的规律,可以判定比最后一个数小的在左子树,否则在右子树。
如果第3条不成立,那么输入数组就不是二叉搜索树的后序遍历。
测试用例:
函数实现:
解题思路:
后序遍历顺序:LRV(左、右、根结点)
后序遍历结果的最后一个数字是根节点。
根据第2节点及二叉搜索树的规律,可以判定比最后一个数小的在左子树,否则在右子树。
如果第3条不成立,那么输入数组就不是二叉搜索树的后序遍历。
测试用例:
int main(){ //后序遍历数组 int succArr[7] = {5, 7, 6, 9, 11, 10, 8}; //只有一个节点的二叉树 int succArr2[1] = {1}; //没有对应一颗二叉搜索树 int succArr3[7] = {7, 5, 11, 10, 6, 8, 9}; //检查并返回结果 std::cout << "Is a post order traversal: " << VerifyOfPostOrder(succArr3, 7) << std::endl; //Output: 0,不是后序遍历序列 return 0; }
函数实现:
bool VerifyOfPostOrder(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 = VerifyOfPostOrder(sequence, i); //判断右子树是不是二叉搜索树 bool Right = true; if(j < length - 1) Right = VerifyOfPostOrder(sequence + i, length - i -1); return (Left && Right); }
相关文章推荐
- java.util.logging.Logger使用详解
- POJ1065+POJ3636
- 用户头像选择功能模块
- Linux 目录树
- 【剑指offer】重建二叉树
- 查找配置文件的工具类
- IOS aac裸数据创建音频SampleBuffer
- php面向对象
- 学习总结-Active Directory 域服务管理01-活动目录简介
- Light OJ 1033 - Generating Palindromes
- 学习C语言指针和链表的体会
- Symfony 系列之为什么要使用MVC
- cocos2d-x环境变量配置
- LeetCode-345.Reverse Vowels of a String
- Android安全框架认识
- Intellij IDEA社区版打包Maven项目成war包,并部署到tomcat上
- Intersection of Two Arrays&Intersection of Two Arrays II
- IDE的一些使用Tips汇总
- 【转载】C/C++杂记:虚函数的实现的基本原理
- makefile的写法(一)