算法 中等 | 11. 二叉查找树中搜索区间

算法 中等 | 11. 二叉查找树中搜索区间

题目描述

给定一个二叉查找树和范围[k1, k2]。
按照升序返回给定范围内的节点值。

样例1

输入:{
   5},6,10
输出:[]
        5
它将被序列化为 {
   5}
没有数字介于6和10之间

样例2

输入:{
   20,8,22,4,12},10,22
输出:[12,20,22]
解释:
        20
       /  \
      8   22
     / \
    4   12
它将被序列化为 {
   20,8,22,4,12}
[12,20,22]介于10和22之间

解题思路

考点:
二叉查找树 :
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;

题解:从给定的BST的根节点开始查找,如果当前节点大于k1,就向左子树搜索,如果当前节点小于k2,就继续向右子树搜索。如果位于[k1,k2],存入结果。

java题解

public class Solution {
   
    private ArrayList<Integer> results;
    /**
     * @param root: The root of the binary search tree.
     * @param k1 and k2: range k1 to k2.
     * @return: Return all keys that k1<=key<=k2 in increasing order.
     */
    public ArrayList<Integer> searchRange(TreeNode root, int k1, int k2) {
   
        results = new ArrayList<Integer>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
动态规划算法是一种常见的算法设计思想,它的主要思路是将问题划分为若干个子问题,并且子问题之间存在重叠,通过求解子问题来解决整个问题。通常来说,动态规划算法需要满足三个条件:最优子结构、无后效性和重复子问题。 Python实现最优二叉查找树的过程如下: 首先,我们需要定义一个节点类Node,用于存储树节点的信息,包括节点值、左右子节点等信息。 其次,我们需要实现一个函数build_optimal_bst,该函数接收一个有序列表keys和对应的概率值probs作为输入,用于构建一棵最优二叉查找树,并返回根节点。 接下来,我们可以实现一个递归函数build_subtree,该函数接收一个有序列表keys、对应的概率值probs、以及当前子树的起始和结束位置作为输入,用于构建当前子树的最优二叉查找树,并返回子树的根节点。 最后,在build_optimal_bst函数调用build_subtree函数递归构建整棵树,并返回根节点即可。 以下是Python实现最优二叉查找树的代码示例: ``` class Node: def __init__(self, val): self.val = val self.left = None self.right = None def build_optimal_bst(keys, probs): n = len(keys) memo = [ * (n + 1) for _ in range(n + 1)] for i in range(n): memo[i][i] = probs[i] for l in range(2, n + 1): for i in range(n - l + 2): j = i + l - 1 memo[i][j] = float("inf") for k in range(i, j + 1): left_cost = memo[i][k - 1] if k > i else 0 right_cost = memo[k + 1][j] if k < j else 0 curr_cost = left_cost + right_cost + sum(probs[i:j + 1]) if curr_cost < memo[i][j]: memo[i][j] = curr_cost root = Node(keys[k]) root.left = build_subtree(keys, probs, i, k - 1) root.right = build_subtree(keys, probs, k + 1, j) return root def build_subtree(keys, probs, start, end): if start > end: return None elif start == end: return Node(keys[start]) else: min_cost = float("inf") for k in range(start, end + 1): left_cost = memo[start][k - 1] if k > start else 0 right_cost = memo[k + 1][end] if k < end else 0 curr_cost = left_cost + right_cost + sum(probs[start:end + 1]) if curr_cost < min_cost: min_cost = curr_cost root = Node(keys[k]) root.left = build_subtree(keys, probs, start, k - 1) root.right = build_subtree(keys, probs, k + 1, end) return root ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值