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

断更很久了,基于一个错误的观念:我想看题,我到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. Javaweb-1note C/S B/S HTML CSS javaScript一点点语法

    ------------恢复内容开始------------ Java web概念: *javaweb:使用java语言开发基于互联网的项目 *软件架构: 1.c/s:Clienr/Server 客户 ...

  2. 安卓逆向 ARM基础篇

    1.ARM  与 Andorid 的关系 android 的操作系统是 LINUX 内核 LINux又是ARM 2.ARM汇编规范 3.ARM指令格式 ARM常用指令开始 1.ARM 的跳转指令 PC ...

  3. 都在用 AI 生成美少女,而我却。。。

    最近 AI 画画特别的火,你能从网上看到非常多好看的图片,于是我就开始了我的安装之旅,我看到的图是这样的. 这样的. 还有这样的. 然后我就开始了我的 AI 安装生成计划. 安装环境 首先我们需要安装 ...

  4. ChatGPT API使用介绍

    1.概述 随着人工智能技术的不断发展,越来越多的AI产品被应用到各个领域,其中最具代表性的莫过于人工智能语言模型.语言模型是一种可以通过学习大量语言数据来预测文本或语音的技术,其应用范围十分广泛,如智 ...

  5. PYTHON编写程序练习-打印99乘法表

    使用for循环嵌套的知识点编写 for i in range(1,10):   #第一层循环,循环乘数 for j in range(1,i+1):   #第二层循环,循环被乘数 print(f&qu ...

  6. jquery获得标签的值或元素的内容

    例如: .html() 获取a标签中的i元素 console.error($("a[name=" + index + "]").html()); 设置a标签里的 ...

  7. [{"morpherRegistry":{},"dynaClass":{"dynaProperties":[{"indexed":false,"mapp

    将list存到json中后,json返回的内容是[{"morpherRegistry":{},"dynaClass":{"dynaProperties ...

  8. zookeeper要点总结

    简述:zookeeper分布式协调服务,节点数据存储在内存,高吞吐,低延时,zkserver cluster组建zookeeper service保证自身高可用 zookeeper数据模型为类文件目录 ...

  9. soursetree 关于https:git remote: Unauthorized和username和password修改

    一.sourcetree推送代码提交不上提示https:git remote: Unauthorized由于没有权限,需要登陆正确的账号以及密码即可以提交 二.SourceTree这是一个无效源路径/ ...

  10. Notepad++来比较文件

    使用Notepad++来比较文件_sanqima的专栏-CSDN博客_notepad比较文件https://blog.csdn.net/sanqima/article/details/50467154