面试题24:二叉搜索树的后序遍历序列
2015-05-31 15:21
489 查看
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
算法思路:
二叉搜索树特点:左结点小于它的父节点,右结点大于它的父节点
后序遍历特点:根节点是后序遍历序列的最后一位,如5、7、6、9、11、10、8,8是根节点,5、7、6是左子树,9、11、10是右子树,根据序列记录根节点的值,然后遍历序列找出小于根节点的元素(根节点的左子树),大于根节点的元素为根节点的右子树,然后划分序列,将左子树和右子树分别看成一个单独的二叉树,再次判断。
C++:
Java:
算法思路:
二叉搜索树特点:左结点小于它的父节点,右结点大于它的父节点
后序遍历特点:根节点是后序遍历序列的最后一位,如5、7、6、9、11、10、8,8是根节点,5、7、6是左子树,9、11、10是右子树,根据序列记录根节点的值,然后遍历序列找出小于根节点的元素(根节点的左子树),大于根节点的元素为根节点的右子树,然后划分序列,将左子树和右子树分别看成一个单独的二叉树,再次判断。
C++:
#include <iostream> using namespace std; 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++) { //二叉搜索树右子树的值都大于根节点,如果有小于的返回false,不能构成后序遍历序列 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); } int main() { int arr1[]={7,4,5,6,1}; int arr2[]={5,7,6,9,11,10,8}; cout<<VerifySquenceOfBST(arr1,5)<<endl; cout<<VerifySquenceOfBST(arr2,7)<<endl; return 0; }
Java:
public class OrderSequence { /** * @param args */ public static void main(String[] args) { int[] sequence={1,5,3}; System.out.println(VerifySequenceOfBST(0,sequence.length-1,sequence)); } public static boolean VerifySequenceOfBST(int start,int end,int[] sequence) { if(sequence==null||start<0||end<0) return false; int i=start; int root=sequence[end];//后序遍历序列最后一个元素是根节点 //找出根节点的左结点 while(i<end&&sequence[i]<root) { i++; } int j=i; //在根节点中的右结点中判断是否有小于根节点的元素,如果有返回false while(j<end) { if(sequence[j]<root) return false; j++; } //对划分好的左右结点再次判断 boolean left=true; if(i>start) { left=VerifySequenceOfBST(start,i-1,sequence); } boolean right=true; if(j<end) { left=VerifySequenceOfBST(i,j,sequence); } return left&&right; } }
相关文章推荐
- 面试题23:从上往下打印二叉树
- C#面试常见题目源代码汇总
- 黑马程序员——IO的使用
- 黑马程序员——Java错误笔记——static
- 2015实习求职总结
- 2015摩根士丹利(Morgan Stanley)实习电话面试
- 黑马程序员——集合框架详解
- 程序员面试内容
- 微软100题(45)几道雅虎面试题
- 微软100题(44)几道腾讯面试题
- 面试题22:栈的压入弹出序列
- 个人发展(职业规划)
- 面试题21:包含min函数的栈
- 面试题之final,finally和finalize的区别以及如果catch里面有return语句,请问finally里面的代码还会执行吗?
- 求职-如何伪装一份cs的简历
- [程序员短壁纸]2015年05月
- 黑马程序员——java面向对象-继承
- 黑马程序员——内部类
- 黑马程序员——OC 基础:实例变量修饰符,description方法和多态
- 面试题:将一个数用二进制打印输出…