判断一个后序遍历是否正确

来源:互联网 发布:红帽linux版本 编辑:程序博客网 时间:2024/06/10 05:28

题目:

一棵二叉查找树,得到一个后序遍历,判断这个后序遍历是否正确。

分析:

方法1,根据中序和后序

根据中序和后序,可以唯一得到一棵二叉树。一棵二叉查找树的中序显然就是所有数字的正常排序,所以,我们首先将所有的后序得到的数字排序,时间复杂度是O(nlogn),然后根据后序和中序遍历,判断二叉树是否可以建立。

总的时间复杂度就是O(nlogn)。

方法2,直接利用查找二叉树的性质

显然,后序遍历的最后一个数字是根节点,然后根据查找二叉树的性质,我们将前面的数字分为两部分,前面一部分都是小于根节点的数字,后面的数字都是大于根节点的数字。然后用递归的方法,判断是否是正确的查找二叉树后序遍历。

代码如下:

#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;bool verifyBST(int *a, int len){if(a == NULL || len < 0)return false;if(len == 0)//如果长度为0,返回正确return true;int i = 0;while(i < len - 1)//找到第一个大于根节点的数字{if(a[i] > a[len - 1])break;i++;}int j = i;while(j < len - 1)//判断右边部分的数字是否都大于根节点{if(a[j] < a[len - 1])return false;j++;}return verifyBST(a, i) && verifyBST(a + i, len - i - 1);//递归调用,判断左边和右边数字是否满足条件}int main(){int a[] = {1,2,4,5,6,3};cout << verifyBST(a, sizeof(a)/sizeof(a[0])) <<endl;return 0;}

总结:

面试中会经常出现二叉树方面的题目,这种题目,要学会挖掘二叉树中的特征,学会用特征进行解题。

原创粉丝点击