当前位置:   article > 正文

算法题(三十一):二叉搜索树(BST)的后序遍历序列_一个二叉搜索树(bst)是通过插入这些整数在以下序列:6,7,10,9,1,4,3,8(即。“6”先

一个二叉搜索树(bst)是通过插入这些整数在以下序列:6,7,10,9,1,4,3,8(即。“6”先

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

分析

后序遍历序列中,最右边数字也就是根结点,会把数集分为左右两部分,左边数集都小于root,右边数集都大于root。左边数集和右边数集与原数集一样,所以可以用递归来做。

代码

  1. public class BSTOrder {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. int[] arr = {1,2,3,5,6,4,8,10,9,7};
  5. //非递归方法实现递归思想
  6. int len = arr.length-1;
  7. int i=0;
  8. while(len!=0){
  9. while(arr[i]<arr[len]){
  10. i++;
  11. }
  12. while(arr[i]>arr[len]){
  13. i++;
  14. }
  15. if(i<len){
  16. System.out.println(false);
  17. return;
  18. }
  19. len--;
  20. i=0;
  21. }
  22. System.out.println(true);
  23. System.out.println(fun(arr, 0, len-1));;
  24. }
  25. //递归方法
  26. public static boolean fun(int[] arr, int l, int r){
  27. if(l >=r){
  28. return true;
  29. }
  30. int i=r;
  31. //找到小于root和大于root数集的的边界,到最后i为小于root的数中最右边的那个
  32. while(i>l && arr[i-1]>arr[r]){
  33. i--;
  34. }
  35. //左边数集(left)应该都小于root
  36. for(int j=i-1; j>=l; j--){
  37. if(arr[j]>arr[r]){
  38. return false;
  39. }
  40. }
  41. //左子树(left)与右子树(right)的情况
  42. return fun(arr, l, i-1) && fun(arr, i, r-1);
  43. }
  44. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/274946
推荐阅读
相关标签
  

闽ICP备14008679号