二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

 

参考以下这颗二叉搜索树:

     5

    / \

   2 6

  / \

 1 3

 

示例 1:

输入: [1,6,3,2,5]

输出: false

 

示例 2:

输入: [1,3,2,6,5]

输出: true

 

提示:

数组长度 <= 1000

 

解题思路:递归分治

后序遍历序列:左子树 | 右子树 | 根结点

二叉搜索树:左子树中所有结点的值都小于根结点,右子树中所有结点的值都大于根结点

从左到右遍历后序遍历序列,找到第一个大于根结点的下标m,[0,m-1]为左子树,[m,j-1]为右子树。判断右子树是否都大于根结点就可以了。之后用递归重复判断其剩下的所有子树。

 

算法流程:

1.返回判断函数recur的判断结果(把后序遍历序列,下标0,该序列的最后一个坐标)

2.定义recur函数

               递归终止条件:i>=j (表示判断结束)

                       返回true (只剩一个元素无需判断)

               定义变量p=i

               用p存储第一个大于根结点的下标

               定义m=p

               判断右子树是否全部大于根结点

               返回判断结果和递归剩下的左右子树

 

代码:

class Solution {

public:

    bool verifyPostorder(vector<int>& postorder) {

  return  rescur(postorder,0,postorder.size()-1);

    }

    bool rescur(vector<int> postorder,int i,int j) {

    if(i>=j) return true;

    int p=i;

    while(postorder[p]<postorder[j])

        p++;

    int m=p;

    while(postorder[p]>postorder[j])

        p++;

    return p==j && 

           rescur(postorder,i,m-1) &&

           rescur(postorder,m,j-1);

    }

};

 

运行步骤:

 [1,3,2,6,5] 

i=0,j=4,m=3,p=j=4    返回true

&&

i=0,j=2,m=1,p=j=2

i=0,j=0,返回true

&&

i=3,j=3,返回true

 

返回true&&true&&true=true

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于这个问题,我们可以使用队列和分治法来求解二叉搜索树的层序遍历。具体的实现方法如下: 1. 首先,根据后序遍历的定义,可以知道二叉搜索树的根节点是序列的最后一个元素。 2. 然后,使用分治法将序列划分为两个部分,即左子和右子。可以找到第一个比根节点小的元素,将其之前的部分定义为左子后序遍历,之后的部分定义为右子后序遍历。 3. 对于左右子,分别重复上述过程,递归求解左右子的层序遍历。 4. 最后,将左右子的层序遍历按照层次合并起来,即可得到整棵二叉搜索树的层序遍历。 下面是具体的实现代码: ```python def postorder_to_levelorder(postorder): if not postorder: return [] root = postorder[-1] mid = bisect.bisect_left(postorder, root) left_postorder = postorder[:mid] right_postorder = postorder[mid:-1] left_levelorder = postorder_to_levelorder(left_postorder) right_levelorder = postorder_to_levelorder(right_postorder) levelorder = [root] queue = [root] while queue: node = queue.pop(0) if node in left_levelorder: levelorder.extend(left_levelorder[left_levelorder.index(node)+1:]) queue.extend(left_levelorder[left_levelorder.index(node)+1:]) if node in right_levelorder: levelorder.extend(right_levelorder[right_levelorder.index(node)+1:]) queue.extend(right_levelorder[right_levelorder.index(node)+1:]) return levelorder ``` 该实现使用了递归和队列,时间复杂度为 O(nlogn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值