面试题 04.05. 合法二叉搜索树

这个就是一个分治法+寻找最小最大值。二叉搜索树根节点要比左子树的最大值大,比右子树的最小值小。

class Solution {

private:

public:

    bool isValidBST(TreeNode* root) {

        if(root == NULL) return true;

        TreeNode* max_left = root->left;

        TreeNode* min_right = root->right;

        while(max_left != NULL && max_left->right != NULL){

            max_left = max_left->right;

        }

        while(min_right != NULL && min_right->left != NULL){

            min_right = min_right->left;

        }

        bool result = true;

        if(max_left) result = result && root->val > max_left->val;

        if(min_right) result = result && root->val < min_right->val;

        return isValidBST(root->left) && isValidBST(root->right) && result;

    }

};

根据你提供的代码和优化后的输入解析逻辑,用户输入 `01.02.04.05.10.15.22` 是可以支持的。以下是详细的分析和生成结果的显示方式。 --- ### 输入解析逻辑 优化后的输入解析函数(`parse_input`)使用正则表达式来分割字符串,支持逗号、点号和空格作为分隔符。因此,输入 `01.02.04.05.10.15.22` 会被正确解析为 `[1, 2, 4, 5, 10, 15, 22]`。 以下是具体步骤: 1. 用户输入:`01.02.04.05.10.15.22` 2. 使用正则表达式 `[,\s\.]+` 分割字符串,得到:`['01', '02', '04', '05', '10', '15', '22']` 3. 将分割后的字符串列表转换为整数列表:`[1, 2, 4, 5, 10, 15, 22]` --- ### 组合生成结果 假设用户选择的组合大小 `r=3`,程序会生成所有可能的 3 个数字的组合。以下是生成的结果: ```plaintext 1, 2, 4 1, 2, 5 1, 2, 10 1, 2, 15 1, 2, 22 1, 4, 5 1, 4, 10 1, 4, 15 1, 4, 22 1, 5, 10 ... ``` --- ### 完整代码示例 以下是一个完整的代码示例,展示如何处理用户输入并生成组合: ```python import re import itertools def parse_input(data_str): """ 解析用户输入的字符串,支持逗号、点号和空格作为分隔符。 :param data_str: 用户输入的字符串 :return: 解析后的整数列表或错误信息 """ if not data_str.strip(): return False, "请输入有效的数据列表!" items = re.split(r'[,\s\.]+', data_str.strip()) try: numbers = list(map(int, items)) return True, numbers except ValueError: return False, "数据格式不正确,请输入逗号、点号或空格分隔的整数!" def generate_combinations(data, r): """ 生成指定大小的组合。 :param data: 整数列表 :param r: 组合大小 :return: 所有可能的组合 """ return list(itertools.combinations(data, r)) # 测试代码 if __name__ == "__main__": user_input = "01.02.04.05.10.15.22" is_valid, parsed_data = parse_input(user_input) if not is_valid: print(parsed_data) # 输出错误信息 else: r = 3 # 假设用户选择的组合大小为 3 combinations = generate_combinations(parsed_data, r) for combo in combinations: print(", ".join(map(str, combo))) ``` --- ### 代码解释 1. **输入解析**: - 使用 `re.split` 按照逗号、点号和空格分割字符串。 - 将分割后的字符串列表转换为整数列表。 2. **组合生成**: - 使用 `itertools.combinations` 生成指定大小的组合。 - 遍历生成的组合,并以逗号分隔的形式打印每个组合。 3. **测试用例**: - 输入 `01.02.04.05.10.15.22` 被解析为 `[1, 2, 4, 5, 10, 15, 22]`。 - 假设组合大小 `r=3`,生成所有可能的 3 个数字的组合。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值