101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
**输入:**root = [1,2,2,3,4,4,3]
**输出:**true
示例 2:
**输入:**root = [1,2,2,null,3,null,3]
**输出:**false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
**进阶:**你可以运用递归和迭代两种方法解决这个问题吗?
递归法:从根开始递归比较左节点和右节点,
如果相等则继续递归比较左节点的左孩子和右节点右孩子、左节点的右孩子和右节点的左孩子
12345678910111213141516class Solution {public: bool isSymmetric(TreeNode *root) { if (root == nullptr) return true; return isSym(root->left, root->right); } bool ...
98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 严格小于 当前节点的数。
节点的右子树只包含 严格大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
**输入:**root = [2,1,3]
**输出:**true
示例 2:
**输入:**root = [5,1,4,null,null,3,6]
**输出:**false
**解释:**根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 10(4)] 内
-2(31) <= Node.val <= 2(31) - 1
对于二叉搜索树每个节点都有严格的上下界
所以可以通过递归对每个结点进行判断,传入上下界即可
左节点上界为根,下界与根的下界相同
右节点上界与根的上界相同,下界为根
1234567891011121314class Solution {public: bool isValidBST(TreeNode *root) { return BSTh ...
94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。递推写法
根据递归思想,先处理左子节点,然后输出,最后处理右子节点
在while(!q.empty())中左子节点直接入栈即可,最后处理右子节点的过程我们可以看成处理右子树,模仿递归
12345678910111213141516171819class Solution {public: vector<int> inorderTraversal(TreeNode *root) { vector<int> ans; stack<TreeNode *> q; TreeNode *cur = root; while (cur != nullptr || !q.empty()) { while (cur != nullptr) { q.push(cur); cur = cur->left; ...
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
**输入:**heights = [2,1,5,6,2,3]
**输出:**10
**解释:**最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4
提示:
1 <= heights.length <=10(5)
0 <= heights[i] <= 10(4)
先考虑暴力解法,我们可以把每根柱子当作高,依次找左右两边最多宽为多少,最后取最大值
再去优化怎么去找左右边界
对于左边界,因为我们要找最近的小于自身的柱子,所以对于左边还大的柱子我们没必要记录
想到单调栈,在当前柱子 小于等于 栈顶时才弹出
此时栈顶柱子为最近小于当前柱的,右边界同理
注意栈为空时左边界需记为-1,右边界记为n,可以当成两头各有一个高度最低的虚拟柱子
123456789101112131415161718192021222324252627282930class Solution ...
79. 单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
**输入:**board = [[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]], word = “ABCCED”
**输出:**true
示例 2:
**输入:**board = [[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]], word = “SEE”
**输出:**true
示例 3:
**输入:**board = [[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]], word = “ABCB”
**输出:**false
提示:
m == board.length
n = board[i] ...
78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
**输入:**nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
**输入:**nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
对于每个元素只有两种情况,在子集中或不在子集中
可以把每个子集都看成len个元素,只不过不在子集中的元素不去记录
所以我们可以对每个元素递归所有情况
1234567891011121314151617181920class Solution {public: vector<vector<int>> ans; vector<int> mid; vector<vector<int>> s ...









