算法:二叉搜索树的后序遍历序列

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

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

5

/ \

2 6

/ \

1 3

示例

  • 输入: [1,3,2,6,5]
  • 输出: true

提示

  • 数组长度 <= 1000

方法:递归分治

后序遍历:

后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:【遍历左子树|遍历右子树|访问根结点】。

二叉搜索树:

在二叉搜索树中:

  • 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
  • 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
  • 任意结点的左、右子树也分别为二叉搜索树。

代码如下:

复杂度分析

  • 时间复杂度:O(N的2次方), 每次调用 compare(i,j) 减去一个根节点,因此递归占用 O(N) ;最差情况下(即当树退化为链表),每轮递归都需遍历树所有节点,占用 O(N) 。
  • 空间复杂度:O(N),最差情况下(即当树退化为链表),递归深度将达到 N 。

END

世上无难事,只要肯攀登,赠友人。

本文内容出处是力扣官网,希望和大家一起刷算法,在后面的路上不变秃但是变强!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较经典的算法题目。假设我们已经得到了一个二分查找树的后序遍历序列,我们可以按照以下步骤来构建这个二叉搜索树: 1. 取出序列最后一个元素,作为根节点。 2. 从序列的第一个元素开始,找到第一个大于根节点的元素,把这个元素之前的所有元素划分为左子树,之后的所有元素划分为右子树。 3. 对左子树和右子树分别递归执行上述步骤,构建出左子树和右子树。 下面是一个Python代码示例: ```python def construct_bst(postorder): if not postorder: return None # 取出根节点 root_val = postorder[-1] root = TreeNode(root_val) # 找到左右子树的分界点 idx = 0 while idx < len(postorder) - 1 and postorder[idx] < root_val: idx += 1 # 构建左右子树 root.left = construct_bst(postorder[:idx]) root.right = construct_bst(postorder[idx:-1]) return root # 示例 postorder = [1, 3, 2, 5, 7, 6, 4] root = construct_bst(postorder) # 输出先序遍历序列 def preorder(root): if root is None: return [] return [root.val] + preorder(root.left) + preorder(root.right) print(preorder(root)) # [4, 2, 1, 3, 6, 5, 7] ``` 以上代码中,我们定义了一个 `construct_bst` 函数来构建二叉搜索树。它接受一个后序遍历序列作为输入,返回构建好的树的根节点。在函数内部,我们首先取出后序遍历序列的最后一个元素作为根节点,然后在序列中找到第一个大于根节点的元素,把它之前的所有元素划分为左子树,之后的所有元素划分为右子树。接下来,我们对左右子树分别递归调用 `construct_bst` 函数,得到左右子树的根节点,然后把它们分别作为当前根节点的左右子节点。最后,我们返回当前根节点。 在示例中,我们构建了一个后序遍历序列为 `[1, 3, 2, 5, 7, 6, 4]` 的二叉搜索树,并输出了它的先序遍历序列 `[4, 2, 1, 3, 6, 5, 7]`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值