我为什么要把代码粘在这里

断更很久了,基于一个错误的观念:我想看题,我到leetcode官网看不就行了吗?

但是若干年后我可能还会到我的博客园看看呀,我有可能上刷题网站吗?而且心得不好写到注释上。

记博客是长久的事,不能贪一时的方便。

这两周我并不是没有记博客,大致看完了图解系统 看了图解网络的tcp 看了10篇mysql45讲 截原图太多了 不好意思发

还有做项目 也是就自己看看。

---2022.3.23

047. 二叉树剪枝

class Solution {
public TreeNode pruneTree(TreeNode root) {
if( root.left!=null) root.left= pruneTree(root.left);
if(root.right!=null)root.right= pruneTree(root.right);
if(root.val==0&&root.left==null&&root.right==null)root=null;
return root; }
}

很难048. 序列化与反序列化二叉树

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec { // Encodes a tree to a single string. StringBuffer s=new StringBuffer("");
public String serialize(TreeNode root) {
dfs(root); return s.toString(); }
void dfs(TreeNode root)
{
if(root==null)
{
s.append("null,"); }
else
{
s.append( String.valueOf(root.val)+",");
dfs(root.left);
dfs(root.right);
} } String [] data_array;
List<String> list;
public TreeNode deserialize(String data) {
data_array=data.split(","); list=new LinkedList<String>(Arrays.asList(data_array));
// for (String x:list)System.out.println(x);
return tdfs(); }
TreeNode tdfs()
{ if(list.get(0).equals("null"))
{
list.remove(0);
return null;
}
TreeNode root=new TreeNode(Integer.valueOf(list.get(0)));
list.remove(0);
root.left=tdfs();
root.right=tdfs();
return root;
}
} // Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

049. 从根节点到叶节点的路径数字之和

class Solution {
int ans=0;
int dfs(int sum,TreeNode root)//sum是之前节点值
{
TreeNode p=root.left,q=root.right;
if(p==null&&q==null)return sum*10+root.val;
int res=0;
if(p!=null)res+= dfs(root.val+sum*10,p);
if(q!=null)res+= dfs(root.val+sum*10,q);
return res;
}
public int sumNumbers(TreeNode root) {
return dfs(0,root);
}
}

050. 向下的路径节点之和

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int ans=0;
void dfs(TreeNode root,int targetSum)
{
if(root==null)
{
return ;
}
if(root.val==targetSum) {
ans++;
} dfs(root.left,targetSum-root.val);
dfs(root.right,targetSum-root.val);
}
public int pathSum(TreeNode root, int targetSum) {
if(root==null)return 0; dfs(root,targetSum);
pathSum(root.left,targetSum);
pathSum(root.right,targetSum);
return ans; }
}

做法秀爆了051. 节点之和最大的路径

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int ans;
public int maxPathSum(TreeNode root) {
ans=Integer.MIN_VALUE;
dfs(root);
return ans;
}
int dfs(TreeNode root)//秀在int 维护路径最大值
{
if(root==null)return 0;
int lmax=Math.max(0,dfs(root.left));//小于0还不如不加
int rmax=Math.max(0,dfs(root.right));
ans=Math.max(lmax+rmax+root.val,ans);
return root.val+Math.max(lmax,rmax);//这里维护一条最长的路径太秀了
}
}

052. 展平二叉搜索树

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
TreeNode tail;
void dfs(TreeNode root)
{
if(root==null)return ; dfs(root.left);
root.left=null;
tail.right= root;
tail=tail.right;
dfs(root.right);
}
public TreeNode increasingBST(TreeNode root) {
TreeNode dummy=new TreeNode(-1);
tail=dummy;
dfs(root);
return dummy.right; }
}

053. 二叉搜索树中的中序后继

class Solution {
public:
int flag=0;//状态0没找到p 1找到p没找到比p->val大的 2找到了 全部return
TreeNode* ans=new TreeNode();
void dfs(TreeNode* root, TreeNode* p)
{
if(flag==2)return ;
if(!root)return ;
dfs(root->left,p);
if(p==root)flag=1;
if(flag==1&&root->val>p->val)
{
flag=2;
ans->right=root;
return ;
}
dfs(root->right,p); }
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
dfs(root,p);
return ans->right; }
};

054. 所有大于等于节点的值之和


class Solution {
public:
vector<int>a,b; void dfs(TreeNode* root)
{
if(!root)return ;
if(root)a.push_back(root->val);
dfs(root->left);
dfs(root->right); }
/*
二分找到 第一个a里面比root->val大的值 ,把root->val替换为 后缀和 注意是后缀和
*/
void change(TreeNode* root)
{
if(!root)return ;
int x=root->val;
int l=0,r=a.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
root->val=b[l];
change(root->left);
change(root->right);
}
TreeNode* convertBST(TreeNode* root) {
dfs(root);
sort(a.begin(),a.end());
for(int x:a)b.push_back(x);
int n=b.size();
for(int i=n-2;i>=0;i--)b[i]+=b[i+1];
change(root);
return root;
}
};

055. 二叉搜索树迭代器

class BSTIterator {
public:
TreeNode* dummy=new TreeNode(-1);
TreeNode* p=dummy;
void dfs(TreeNode* root)
{
if(!root)return ;
dfs(root->left);
dummy->right=root;
dummy=dummy->right;//可以合成一步 但没必要
//这里相当于把它拉成一个往右的链表
dfs(root->right);
}
BSTIterator(TreeNode* root) {
dfs(root); } int next() {
p=p->right;
return p->val; } bool hasNext() {
return p->right; }
};

056. 二叉搜索树中两个节点之和

哈希表 ez


class Solution {
public:
bool flag=false;
unordered_map<int ,int >memo;
void dfs(TreeNode* root,int k)
{
if(flag)return ; if(!root)return ;
if(memo.find(k-root->val)!=memo.end())
{
flag=true;
}
memo[root->val]++;
dfs(root->left,k);
dfs(root->right,k);
}
bool findTarget(TreeNode* root, int k) {
dfs(root,k); return flag;
}
};

057. 值和下标之差都在给定的范围内 典型题

1.找离给定数字最接近的值是多少(第一个大于等于 第一个小于) 用set+二分

2.set维护滑动窗口

    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
typedef long long LL;
multiset<LL>S;
S.insert(1e18),S.insert(-1e18);//哨兵 肯定会返回
for(int i=0,j=0;i<nums.size();i++)
{
if(i-j>k)S.erase(S.find(nums[j++]));//find是因为只想删一个 所以用迭代器 不find全删了
int x=nums[i];
auto it= S.lower_bound(x);
//大于等于x最小的数
if(*it-x<=t)return true;
it--;
//小于x的最大数
if(x-*it<=t)return true;
S.insert(x);
/*
set不包含重复元素 multiset可以
insert 插入一个数
find()q.find(1)!=q.end(); //查找元素是否在set 找不到就返回end迭代器
count(x) 返回x的个数 set只可能0,1 multiset可能多个
erase()
1.输入一个数x 删除所有x O(k+logn)
2.输入1个迭代器 删掉这个迭代器
lower_bound()返回大于等于x的最小的数的迭代器 不存在返回end
upper_bound()返回大于x的最小的数
迭代器支持*解除引用 不支持随机访问 支持++ 和-- 复杂度logn 前驱是前一个数 后继是后一个数
*/
}
return false;
}

058. 日程表 set+pair

找找离给点区间 最近的左右端点

i = lower_bound第一个右端点

i-- 左端点

class MyCalendar {
public:
typedef pair<int,int>PII;
int INF=2e9;
set<PII>S;
MyCalendar() {
//不想判断边界
S.insert({-INF,-INF});
S.insert({INF,INF}); }
bool check(PII a,PII b)//左开右闭 是否有交集
{
if(a.second<=b.first)return false;
if(b.second<=a.first)return false;
return true; }
//找离给点区间 最近的左右端点
bool book(int start, int end) {
auto i=S.lower_bound({start,start});
auto j=i;
j--;
PII t(start,end);
if(check(*i,t)||check(*j,t))return false;
S.insert(t);
return true;
}
};

剑指 Offer II 树的更多相关文章

  1. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  2. 剑指offer 判断树是不是对称的

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  3. 剑指Offer——Trie树(字典树)

    剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...

  4. 《剑指offer》 树的子结构

    本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...

  5. 剑指Offer:树的子结构【26】

    剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...

  6. 剑指 Offer 26. 树的子结构

    剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...

  7. 【剑指Offer】树的子结构 解题报告(Python)

    [剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  8. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  9. 【剑指offer】树的子结构

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...

  10. 【Java】 剑指offer(26) 树的子结构

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...

随机推荐

  1. CSS特效集锦(9款 , 总有一款是你喜欢的)

    主要是: 穿越时空特效, 图片放大镜, 3D相册, 立方体相册, 昼夜更替特效, 飘雪, 七彩雨, 签名生成器, 水波纹动画等 代码部分 <section> <div class=& ...

  2. JDK、tomcat、MySQL5.7安装教程

    JDK自定义安装 一.安装JDK.JRE 1.在E盘下建立一个java文件夹,在java文件夹下分别建立jdk和jre文件夹 2.双击安装包 3.点击下一步,更改安装路径,安装到第一步创建好的jdk文 ...

  3. UBUNTU安装代码阅读器Understand

    https://blog.csdn.net/weixin_40641902/article/details/79607225 1.直接下载 Understand-3.1.670-Linux-64bit ...

  4. 跳板攻击之:lcx 端口转发

    跳板攻击之:lcx 端口转发 郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责 ...

  5. 视觉SLAM基础-李群和李代数

    李群和李代数 目录 李群和李代数 引言 1.0 李群 1.1 群 1.2 李群基础定义 2.0李代数 2.1 引出 2.2 李代数的定义 2.3 李代数 \(so(3)\) 2.4 李代数 \(se( ...

  6. I2C接口(续一)

    I2C接口共涉及到18个寄存器,下面就来对它们进行具体分析. 先来看I2C配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40050000(I2C0),0x40054000(I2C1),0x4 ...

  7. 【狂神说】SpringMVC笔记

    1.回顾MVC ssm:mybatis+Spring+SpringMVC MVC三层架构 ssm框架:研究官方文档,锻炼自学能力,锻炼项目能力 SpringMVC+Vue+SpringBoot+Spr ...

  8. react 04 生命周期

    生命周期的三个状态 mounting  : 组件插入到dom updating: 将数据更新到dom unmounting:将组件移除dom 生命周期的钩子函数 ComponentWillMount: ...

  9. 【剑指Offer】【链表】复杂链表的复制

    题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判 ...

  10. vue常用插件集合(常用,但一般UI库又不太能满足)

    # v-base-plugins   ``` bash # install  npm i v-base-plugins --save  npm start #引入 import myPlugin fr ...