LeetCode #669:Trim A BST(修剪二叉搜索树)

题目描述

本题一种经典错误就是在带返回值的递归函数中,遇到在范围外的结点就直接返回 NULL,实际上这种策略在官方给出的示例 2 中就是错误的。

正确的策略应为:遇到小于范围内的结点,递归修剪该结点的右子树(因为右子树可能会落在范围内);同理遇到大于范围内的结点,递归修剪该结点的左子树;若结点值落在范围内,则递归修剪左右节点并更新左右结点的值。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root == NULL) // 遇到空结点不用修剪,返回空
            return NULL;
        
        if(root->val < low) // 遇到小于范围内的结点,递归修剪该结点的右子树,返回结果供上层拼接
            return trimBST(root->right, low, high);
        
        if(root->val > high) // 遇到大于范围内的结点,递归修剪该结点的左子树,返回结果供上层拼接
            return trimBST(root->left, low, high);

        // 结点值落在范围内,则递归修剪左右节点并更新(拼接)左右结点的值
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);

        return root;
    }
};

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注