树
Noric!
这个作者很懒,什么都没留下…
展开
-
leetcode 543 二叉树的直径
直径指的是任意两个节点间的最大距离。可以自底向上返回每个节点在子节点中的最大路径,记录最大值。class Solution {public: int maxi = 0; int dfs(TreeNode* node){ if(!node) return 0; int left = dfs(node->left); int right = dfs(node->right); maxi = ma.原创 2021-11-01 20:05:41 · 39 阅读 · 0 评论 -
Leetcode 538 把二叉搜索树转为累加树 (反中序遍历)
观察节点累加的顺序,正好是“右 — 中 — 左”的顺序。即中序遍历的反序。使用一个全局变量记录累加的值,可以使代码更简洁。class Solution {public: int sum = 0; TreeNode* convertBST(TreeNode* root) { if(!root) return nullptr; convertBST(root->right); root->val += sum; .原创 2021-11-01 19:01:19 · 70 阅读 · 0 评论 -
LeetCode 437 路径总和 III(前缀和)
解这道题的思路有两种:固定根节点,找子树中满足的所有路径(时间复杂度 O(n2)O(n^2)O(n2),空间复杂度O(n)O(n)O(n))前缀和思想,固定路径的终点,向上找到父节点中满足的路径(时间复杂度 O(n)O(n)O(n),空间复杂度O(n)O(n)O(n))第一种思路其实就是暴力。用两个递归,没有特别的技巧。第二种思路中,不断记录从根节点到当前节点的路径和,存储到map中便于快速查找。这样,每遇到新的节点,只需要查找父节点中路径和为current-target 的值的个数即可。.原创 2021-10-07 21:12:56 · 76 阅读 · 0 评论 -
LeetCode337 打家劫舍 III(递归DP)
此题采用了递归+DP的思想。不想连的节点,看起来很乱无法选择。如果按照子树的递归思想组织,就能简化很多。每个节点的状态都有两种:选择 or 不选择。由此建立两张表:choose[node] 表示选择当前节点时,其子树的最大权值和skip[node] 表示不选择当前节点时,其子树的最大权值和每个节点仅与其左右子节点相接,因此可以写出状态转移方程:若选择当前节点,则其两个孩子都不能被选择。choose[node] = value + skip[l] + skip[r]若不选择,两个孩子选.原创 2021-10-06 19:11:15 · 77 阅读 · 0 评论 -
LeetCode297 二叉树的序列化与反序列化
可以用深度优先和广度优先搜索来做。这里仅实现了深度优先的中序遍历进行编码。注意一下用到的小trick:用特殊分割符号例如‘,’把不同的值进行分割使用list更快,vector会超时递归函数不要返回string,传递string地址,更快附上代码:class Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) { string out =.原创 2021-10-06 18:22:58 · 65 阅读 · 0 评论 -
LeetCode 236 二叉树的最近公共祖先
递归函数:判断当前节点是否包含p节点或q节点。(返回bool)利用递归函数判断左分支是否包含p/q — ifLeft,右分支是否包含p/q — ifRight。利用条件判断当前节点是否为p/q — ifCurrent。递归函数的返回值,由定义(是否包含p、q)得 ifLeft || ifRight || ifCurrent判断当前节点是否为公共祖先有两种情况:左右子分支分别包含p、q。ifLeft && ifRight当前节点为p、q中的一个,并且子分支包含另一个。ifCur.原创 2021-10-05 20:15:34 · 76 阅读 · 0 评论 -
LeetCode124 二叉树的最大路径和
使用递归的思想,先考虑(一个根节点+左右子节点)最小树的情况可能的路径有三种:根节点 + 左节点最大路径根节点 + 右节点最大路径左节点最大路径 + 根节点 + 右节点最大路径其中,左右节点的最大路径可以通过不断递归得到。需要注意的是:情况1、2是可以传递的,第3种情况则不能传递。函数返回时仅选择前两种情况较大的一个。使用全局maximum来记录第3种情况的最大值,初始化为INT_MIN由于节点值可能为负,因此从左右分支最大值应与0进行比较后传递。附上代码:/** * Def.原创 2021-10-05 16:11:43 · 51 阅读 · 0 评论 -
LeetCode105 前序+中序遍历构造二叉树
递归法:递归函数内部仅构造一个根节点,左右指针的指向问题递归地交给左子树和右子树分别处理记录四个参数:树在对应前序遍历和中序遍历的开始、结束位置。(pre_start, pre_end, in_start, in_end)前序遍历【根,左,右】;中序遍历【左,根,右】根节点:位于前序遍历的开始;构造根节点左子树:中序遍历根节点之前,计算左子树节点数,用来在前序遍历中分割左右子树右子树:中序遍历根节点之后,前序遍历左子树之后迭代法:分别遍历前序与中序,并使用栈存储经过的点若中序遍历当前.原创 2021-10-04 22:06:53 · 51 阅读 · 0 评论 -
LeetCode101 对称二叉树
递归方法:递归函数仅考虑同一父节点的左右子节点之间的对称关系– 同为空指针,true– 其中一个为空指针,false– 数值是否相同 + 左子树是否对称 + 右子树是否对称 = 是否满足对称性(镜面对称,两个节点的移动相反,一个向左,一个向右)迭代方法:每次将左右节点一起加入队列中每次取前两个进行比较再将这两个节点的子节点加入队列附上代码:递归法class Solution {public: bool check (TreeNode* p1, TreeNode*.原创 2021-10-02 22:30:41 · 58 阅读 · 0 评论 -
LeetCode验证二叉搜索树
二叉搜索树的定义:左子树的节点全部 小于 当前节点右子树的节点全部 大于 当前节点所有左子树和右子树本身都是二叉搜索树方法一:中序遍历只要保证中序遍历展开后,数值单调递增,即为二叉搜索树。时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)。【优化:使用一个变量存储前一个数值,不断更新。空间复杂度O(1)O(1)O(1)】方法二:递归解决将判断一个树是否为二叉搜索树,拆分为左子树是否为二叉搜索树当前值是否比前一个值大右子树是否为二叉搜索树代码非常简洁,时间.原创 2021-10-02 16:50:59 · 157 阅读 · 0 评论 -
LeetCode96 n个节点组成的不同二叉搜索树
方法一:本题用到了卡塔兰数,其计算公式为 C0=1,Cn+1=2(2n+1)n+2∗CnC_0 = 1, C_{n+1} = \frac{2(2n+1)}{n+2}*C_nC0=1,Cn+1=n+22(2n+1)∗Cn。任何长度的不同二叉搜索树数量都可以用此式子计算。【时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)】方法二:此外,还有一种DP的推理方法,假设有 1,2,...,n1, 2, ..., n1,2,...,n 个节点,选取任意一个节点iii作为根节点,.原创 2021-10-01 20:50:32 · 626 阅读 · 0 评论 -
Leetcode 二叉树的后序遍历
迭代:/** * 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) {.原创 2021-08-06 23:27:26 · 73 阅读 · 1 评论 -
Leetcode 二叉树的前序遍历
迭代法:在压入栈的时候,存储输出值。(与中序遍历仅有输出行的位置不同)class Solution {public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> stk; vector<int> out; while(root || stk.size() > 0){ while(root){.原创 2021-08-05 21:55:02 · 181 阅读 · 0 评论 -
Leetcode 二叉树的中序遍历
方法有三个:Morris 中序遍历:时间复杂度 O(N)O(N)O(N),空间复杂度 O(1)O(1)O(1)递归遍历:时间复杂度 O(N)O(N)O(N),空间复杂度 O(N)O(N)O(N)(递归栈)迭代遍历:时间复杂度 O(N)O(N)O(N),空间复杂度 O(N)O(N)O(N)Morris 中序遍历:递归遍历:/** * Definition for a binary tree node. * struct TreeNode { * int val; * .原创 2021-08-04 22:18:33 · 96 阅读 · 0 评论 -
Leetcode 二叉树展开为链表
非递归的方法:若 root 左子树非空,则找到左子树的最右节点,将右子树接到右节点再将左子树移到根节点的右节点上,root 不断更新成右节点,最后得到输出/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(.原创 2021-08-03 22:28:09 · 64 阅读 · 0 评论