面试训练排序二叉树

来源:互联网 发布:游戏策划 美工 强奸 编辑:程序博客网 时间:2024/06/15 00:11



思路呢 就是利用后序遍历的性质吧

1 数组最后一个元素为根元素,左边都为 左子树和右子树节点。

2 根据数组的根结点以及搜索二叉树的性质,左边小 右边大 ,那么遍历左边的数组元素 找到第一个大于该元素的节点为右子树的节点

3 此时可以用递归解决问题咯

比如上题的过程如下 

{5,7,6,9,11,10,8}

根节点 8

遍历 找到 9 为右子树的第一个节点

那么 可以 5 7 6为左子树 6 为左子树根结点  9 10 11 为右子树 其中11为右子树根结点

依次这么递归下去。

如何返回呢~我们知道后序遍历的性质吧,先左子树 后右子树 然后根,保证左子树的节点都小于,保证右子树的节点都大于根。那么依次这么细分 知道只剩下一个元素

代码如下

#include "stdio.h"int judgeSortTree(int *data,int start,int last){int ret =0;int index=0;int i =0;if(start >=last){ret=1;return ret;}for(index=start;index<last;index++){if(data[index]>data[last])break;}for(i=start;i<index;i++)  /*当然左子树检测这一步可以省去,因为如果左子树中有元素大于根元素,其毕被分到右子树中,因此不需要判断也可以。*/{if(data[i]>data[last]){return 0;}}/*右子树必须大于根*/for(i=index;i<last;i++){if(data[i]<data[last]){return 0;}}return judgeSortTree(data,start,index-1)&&judgeSortTree(data,index,last-1);}int main(){int data[]={5,7,6,9,11,10,8}; /*yes*///int data[] ={7,4,6,5};     /*No*/int ret =0;int len= sizeof(data)/sizeof(data[0]);ret = judgeSortTree(data,0,len-1);if(ret ==1){printf("OK\n");}else{printf("No\n");}return 0;}