文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++二叉搜索树实例分析

2023-06-19 12:47

关注

本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

独一无二的二叉搜索树

Given an integer n, generate all structurally unique BST"s (binary search trees) that store values 1 ... n.

Example:

Input: 3
Output:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST"s shown below:

   1         3     3      2      1
       /     /      /      
3     2     1      1   3      2
/     /                       
2     1         2                 3

这道题是之前的 Unique Binary Search Trees 的延伸,之前那个只要求算出所有不同的二叉搜索树的个数,这道题让把那些二叉树都建立出来。这种建树问题一般来说都是用递归来解,这道题也不例外,划分左右子树,递归构造。这个其实是用到了大名鼎鼎的分治法 Divide and Conquer,类似的题目还有之前的那道 Different Ways to Add Parentheses 用的方法一样,用递归来解,划分左右两个子数组,递归构造。刚开始时,将区间 [1, n] 当作一个整体,然后需要将其中的每个数字都当作根结点,其划分开了左右两个子区间,然后分别调用递归函数,会得到两个结点数组,接下来要做的就是从这两个数组中每次各取一个结点,当作当前根结点的左右子结点,然后将根结点加入结果 res 数组中即可,参见代码如下:

解法一:

class Solution {public:    vector<TreeNode*> generateTrees(int n) {        if (n == 0) return {};        return helper(1, n);    }    vector<TreeNode*> helper(int start, int end) {        if (start > end) return {nullptr};        vector<TreeNode*> res;        for (int i = start; i <= end; ++i) {            auto left = helper(start, i - 1), right = helper(i + 1, end);            for (auto a : left) {                for (auto b : right) {                    TreeNode *node = new TreeNode(i);                    node->left = a;                    node->right = b;                    res.push_back(node);                }            }        }        return res;    }};

我们可以使用记忆数组来优化,保存计算过的中间结果,从而避免重复计算。注意这道题的标签有一个是动态规划 Dynamic Programming,其实带记忆数组的递归形式就是 DP 的一种,memo[i][j] 表示在区间 [i, j] 范围内可以生成的所有 BST 的根结点,所以 memo 必须是一个三维数组,这样在递归函数中,就可以去 memo 中查找当前的区间是否已经计算过了,是的话,直接返回 memo 中的数组,否则就按之前的方法去计算,最后计算好了之后要更新 memo 数组,参见代码如下:

解法二:

class Solution {public:    vector<TreeNode*> generateTrees(int n) {        if (n == 0) return {};        vector<vector<vector<TreeNode*>>> memo(n, vector<vector<TreeNode*>>(n));        return helper(1, n, memo);    }    vector<TreeNode*> helper(int start, int end, vector<vector<vector<TreeNode*>>>& memo) {        if (start > end) return {nullptr};        if (!memo[start - 1][end - 1].empty()) return memo[start - 1][end - 1];        vector<TreeNode*> res;        for (int i = start; i <= end; ++i) {            auto left = helper(start, i - 1, memo), right = helper(i + 1, end, memo);            for (auto a : left) {                for (auto b : right) {                    TreeNode *node = new TreeNode(i);                    node->left = a;                    node->right = b;                    res.push_back(node);                }            }        }        return memo[start - 1][end - 1] = res;    }};

“C++二叉搜索树实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯