判断排序二叉树的后序遍历是否正确(对递归算的总结)

来源:互联网 发布:阿米巴软件 编辑:程序博客网 时间:2024/05/16 10:57
#include <iostream>using namespace std;//排序二叉树的性质/*  *.终止条件:1.开始>=结尾返回真    *.   2.s >= e 因为不出现问题的话,一定能到达 s>=e的情况。知道到达了s >= e即为真   *.     1.最后一个节点是root  2.在root之前的节点 连续的大于root的是其右子树, 再之前连续小于root的是其左子树  3.递归调用   */ bool treehelper(int a[], int s, int e){if(a == NULL)return 0;if(s >= e)return 1; //在没有右子树的情况下,可能会出现s >= e int i = e-1;while( i >= s && a[e] <= a[i] )i--;if(!treehelper(a,i+1,e-1)){return 0;}int k = i;while( i >= s && a[e] > a[i])i--;if( s < i+1 )return 0;//如果左子树判断完还有大于root的值,直接说明这不是一颗排序二叉树的后序 return treehelper(a,s, k);}int PostorderResult(int a[], int n){ return treehelper(a,0,n-1);}int main(){int a[] = {1,5,7,6,9,11,10,8};int i = PostorderResult(a,sizeof(a)/sizeof(a[0]));cout <<i << std::endl;return 0;} //至于前序的更简单 遍历一下就行了。中序的话bool treehelper2(int a[], int s, int e){if( a == NULL)return NULL;if( s >= e)return 1;int i = s+1;while( i <= e && a[s] > a[i])i++;if(!treehelper2(a,s+1,i-1)){return 0;}int k = i;while( i <= e && a[s] <= a[i])i++;if( e > i-1 )return 0;return treehelper2(a,k,e); } 

这里的递归是很经典的,我自己总结一下,不过总结的不咋点。。。

1.子问题

2.终止条件(包括一些边界)

子问题:每个后序判断都是划分成其左子树的后序一右子树的后序,然后左右子树可以递归下去。这就找到了子问题。

终止条件:当s>=e时,会出现s>=e只有不出问题的递归到每个子节点才有可能发生,当递归到这了,这个后序代表着是没有问题的。

总结的一般形式:

void func(int a, int b)//这里的参数都是控制子问题规模的参数

{

if(...)return ;//递归的终止条件

      //下面是对当前这个问题进行解决,一般都会涉及到子问题

 int i =  func(a+x,b-x); //这个是对子问题的划分,也是控制子问题

int j =  func(a-x,a+x); //

return i*j;//最后根据子问题返回的值,返回这整个问题的结果。

}

自娱自乐,轻喷!!


0 0
原创粉丝点击