天天看点

算法 中等 | 11. 二叉查找树中搜索区间题目描述解题思路java题解C++题解python题解

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

  • 题目描述
    • 样例1
    • 样例2
  • 解题思路
  • java题解
  • C++题解
  • python题解

题目描述

给定一个二叉查找树和范围[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>();
        helper(root, k1, k2);
        return results;
    }
    
    private void helper(TreeNode root, int k1, int k2) {
        if (root == null) {
            return;
        }
        if (root.val > k1) {
            helper(root.left, k1, k2);
        }
        if (root.val >= k1 && root.val <= k2) {
            results.add(root.val);
        }
        if (root.val < k2) {
            helper(root.right, k1, k2);
        }
    }
}
           

C++题解

class Solution {
public:
    /**
     * @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.
     */
    vector<int> ans;
    void  dfs(TreeNode* node, int k1, int k2) {
       
        if (node->left && node->val>=k1)
            dfs(node->left, k1, k2);
         if (node->val >= k1 && node->val <= k2)
            ans.push_back(node->val);
        if (node->right && node->val<=k2)
            dfs(node->right, k1, k2);
    }
    vector<int> searchRange(TreeNode* root, int k1, int k2) {
        // write your code here
        if (root==NULL)
            return ans;
        dfs(root, k1, k2);
        return ans;
    }
};
           

python题解

class Solution:
    """
    @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.
    """     
    def searchRange(self, root, k1, k2):
        # write your code here
        ans = []
        if root is None:
            return ans
        queue = [root]
        index = 0
        while index < len(queue):
            if queue[index] is not None:
                if queue[index].val >= k1 and \
                    queue[index].val <= k2:
                    ans.append(queue[index].val)

                queue.append(queue[index].left)
                queue.append(queue[index].right)

            index += 1
        return sorted(ans)
           

继续阅读