![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=1739032841-dAMX2mAtbrEwS0EMtWyZ4VTf3gFjF9zq-0-9d8f5d985da285e9685b371dc8b12f25)
分析与解答:
二元查找树的特点是:对于任意一个结点,它的左子树上所有结点的值都小于这个结点的值,它的右子树上所有结点的值都大于这个结点的值。根据它的这个特点以及二元查找树后序遍历的特点,可以看出,这个序列的最后一个元素一定是树的根结点(上图中的结点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=1739032841-DLA3s87nQNrFVtHxFj9P7alQc4uWiAqa-0-cf84a8eca451567b20ea6a5cd87b0169)
程序的运行结果为
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_111_01.jpg?sign=1739032841-XPZeAyWJHOGNRMVFYxm4EmHu7qVJd7Cb-0-4da45bda0ed6298d6bc14b6c3dda19c3)
算法性能分析:
这个方法对数组只进行了一次遍历,因此,时间复杂度O(n)。