zoukankan      html  css  js  c++  java
  • 判断该数组是某二元查找树的后序遍历

    输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
          8
        /  \
      6  10
     /  \ /  \
    5  7 9  11
    因此返回true。
    如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
    分析:主要考查对二元查找树的理解。
    在 后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前 面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右 两部分是不是都是二元查找树。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include<string.h>
     4 
     5 int main()
     6 {
     7     int IsSquenceBSTree(int *p,int length);
     8     int a[7]={9,4,6,7,8,12,10};
     9     if(IsSquenceBSTree(a,7))
    10     printf("Is SquenceBSTree");
    11     else
    12     printf("Not a SquenceBSTree");
    13     return 0;
    14 }
    15 
    16 int IsSquenceBSTree(int *p,int length)
    17 {
    18     if(p==NULL&&length<=0)
    19     return 0;
    20     int root=p[length-1];
    21     int i=0,j=0;
    22     int bLeft=1,bRight=1;
    23     for(i=0;i<length-1;i++)
    24     {
    25         if(p[i]>root)
    26         break;
    27     }
    28     j=i;
    29     for(;j<length-1;j++)
    30     {
    31         if(p[j]<root)
    32         return 0;
    33     }
    34     if(i>0)
    35     bLeft=IsSquenceBSTree(p,i);
    36     if(j<length-1)
    37     bRight=IsSquenceBSTree(p+i,length-i-1);
    38     return (bLeft+bRight)/2;
    39 }
  • 相关阅读:
    线程的休眠和中断
    线程的强制运行
    多线程基础
    jar文件につぃて
    Exception和RuntimeException
    异常的抛出
    java之适配器模式
    分支语句
    运算符与表达式
    练习课(一)
  • 原文地址:https://www.cnblogs.com/nannanITeye/p/3130995.html
Copyright © 2011-2022 走看看