![C#程序员面试算法宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/733/33643733/b_33643733.jpg)
上QQ阅读APP看书,第一时间看更新
3.7 如何判断一个数组是否是二元查找树后序遍历的序列
难度系数:★★★☆☆ 被考察系数:★★★★☆
题目描述:
输入一个整数数组,判断该数组是否是某二元查找树的后序遍历的结果。如果是,那么返回true,否则返回false。例如数组{1,3,2,5,7,6,4}就是下图中二叉树的后序遍历序列。
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_109_03.jpg?sign=1738796403-B0Ii328nCS1WaYU2n3xZIkqBqBhxyXb2-0-569eb6b15dd0ae0e570c47771f0effdd)
分析与解答:
二元查找树的特点是:对于任意一个结点,它的左子树上所有结点的值都小于这个结点的值,它的右子树上所有结点的值都大于这个结点的值。根据它的这个特点以及二元查找树后序遍历的特点,可以看出,这个序列的最后一个元素一定是树的根结点(上图中的结点4),然后在数组中找到第一个大于根结点4的值5,那么结点5之前的序列(1,3,2)对应的结点一定位于结点4的左子树上,结点5(包含这个结点)后面的序列一定位于结点4的右子树上(也就是说结点5后面的所有值都应该大于或等于4)。对于结点4的左子树遍历的序列{1,3,2}以及右子树的遍历序列{5,7,6}可以采用同样的方法来分析,因此,可以通过递归方法来实现,实现代码如下:
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_110_01.jpg?sign=1738796403-W4wiGBgNEeBYBNlqTit2Q3OILML9JyOC-0-0df29ece9306e696d6c488f020a7e365)
程序的运行结果为
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_111_01.jpg?sign=1738796403-JOPATg5Em5l7HTbtTJ0PydHdDkMvmq2P-0-5e714b116cd581501a4a767b914ceb1c)
算法性能分析:
这个方法对数组只进行了一次遍历,因此,时间复杂度O(n)。