比如给出数组[5,7,6,9,11,10,8]判断其是否为二叉排序树的后序遍历结果,也就是能不能画出一个二叉排序树使其的后序遍历结果与这个数组相同,若可以返回true,不可以返回false。
代码:
int is_valid(int *data, int n){ if(data==NULL)return 0; int left=1; int right=1; int i=0; int j; int root=data[n-1]; while(data[i]<root){ i++; } for(j=i+1;j<n-1;j++){ if(data[j]<root){ return 0; } } if(i>0){ left=is_valid(data, i); } if(j<n-1){ right=is_valid(data, j); } return (left && right); }
思路:
数组的最后一个数肯定为根节点,那么从头遍历,找到第一个小于根节点和大于根节点数的交界处,然后继续遍历从这个数开始到根节点之间的数,若存在小于根节点的数(理论上从交界点往后到根节点之前的数都应该大于根节点,因为它们处在根节点的右子树上。)那么返回false。
然后递归。。。
时间: 2024-12-31 03:25:21