二叉树--二叉搜索树的后序遍历序列
Posted 算法和数据结构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树--二叉搜索树的后序遍历序列相关的知识,希望对你有一定的参考价值。
来源:LeetCode
难度:中等
描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
假设咱们有一棵二叉搜索树如下:
示例1:
示例2:
分析:
题目就是给一个数组,让咱们判断该数组是否是一棵二叉搜索树的后序遍历转变来的。
首先咱们知道后续遍历一句话描述就是左右根,对二叉树的遍历有兴趣的同学可以查看,而二叉搜索树的特点是任意一个左子树节点都比根节点小,任意一个右子树节点都比根节点大。
将这两个特点合起来可知,如果输入的数组是二叉搜索树的后序遍历结果,那么最后一个根节点就是原二叉树的根,顺着根节点往前倒序遍历所有比该元素大的都是根节点的右子树,剩下的都是比根节点小的都是左子树,然后左右子树分别又符合上述特点...
解题
方法一:递归分治法
思路:如分析,把数组最后一个元素作为根节点,将根节点前面所有连续比其大的元素作为右子树节点,剩下的作为左子树节点,其中左子树中不能有比根节点大的元素,之后左右子树节点递归上述操作
代码:
1public static boolean verifyPostorder(int[] postorder) {
2 if (postorder == null || postorder.length <= 1) {
3 return true;
4 }
5 //对整个数组进行判断
6 return check(postorder, 0, postorder.length - 1);
7}
8
9private static boolean check(int[] postorder, int start, int end) {
10 //start大于等于end,遍历完毕
11 if (start >= end) {
12 return true;
13 }
14 //最后一个节点为根节点
15 int root = postorder[end];
16 int rightIndex = end - 1;
17 for (; rightIndex >= start; rightIndex--) {
18 //找到连续比根节点大的元素作为右子树节点
19 if (postorder[rightIndex] < root) {
20 break;
21 }
22 }
23 //剩余元素为根节点左子树节点
24 int leftIndex = start;
25 while (leftIndex < rightIndex) {
26 //左子树中不能存在比根节点大的元素
27 if (postorder[leftIndex] > root) {
28 return false;
29 }
30 leftIndex++;
31 }
32 //递归左子树节点和右子树节点
33 return check(postorder, start, rightIndex)
34 && check(postorder, rightIndex + 1, end - 1);
35}
时间复杂度:O(n2) 当二叉搜索树为一根链表时,每次都要遍历剩余整个数组元素,所以为n*n
空间复杂度:O(n)
以上仅是个人思路解法,觉得还不错欢迎点赞关注分享
往期精彩推荐
以上是关于二叉树--二叉搜索树的后序遍历序列的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《二叉树 - 二叉搜索树》中等01 —— LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列
⭐算法入门⭐《二叉树 - 二叉搜索树》中等02 —— LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列