94. 二叉树的中序遍历 & 96. 不同的二叉搜索树

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

前言

Hello!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!  

唯有努力💪  

知其然 知其所以然!

本文只记录感兴趣的部分

每日一题

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]  

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

解答

加强一下迭代的思路

使用stack模拟中序遍历就可以了

  • 不断寻找最左节点
  • 获取栈顶元素 压入ans
  • 转入右子树
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> s;
        while(root || !s.empty()) {
            while(root) {
                s.push(root);
                root = root->left;
            }
            TreeNode* node = s.top();
            s.pop();
            ans.push_back(node->val);
            root = node->right;
        }
        return ans;
    }
};

题目

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

  示例 1:

输入:n = 3

输出:5

示例 2:

输入:n = 1

输出:1  

提示:

  • 1 <= n <= 19

解答

看到题目思考了一会

猜测是一道数学题

想到估计是一道动态规划

但是没有找到动态关系

看了官方题解

image.png

image.png

image.png

依据思路,得到代码

class Solution {
public:
    int numTrees(int n) {
        vector<int> G(n + 1, 0);
        G[0] = 1;
        G[1] = 1;
        for(int i = 2; i <= n; ++i) {
            for(int j = 1; j <= i; ++j) {
                G[i] += G[j - 1] * G[i - j];
            }
        }
        return G[n];
    }
};

还有数学方法(果然)

image.png

class Solution {
public:
    int numTrees(int n) {
        long long c;
        c = 1;
        for(int i = 0; i < n; ++i) {
            c = c * (2 * (2 * i + 1)) / (i + 2) ;
        }
        return c;
    }
};

总结

  • 尽管能猜到题会用什么方法
  • 但还是想不出来
  • 还是得多练习 多总结
  • 居然这道题以前做了
  • 需要加深印象!

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述