剑指 Offer II 树
我为什么要把代码粘在这里
断更很久了,基于一个错误的观念:我想看题,我到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 树的更多相关文章
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 剑指offer 判断树是不是对称的
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- 《剑指offer》 树的子结构
本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...
- 剑指Offer:树的子结构【26】
剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...
- 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...
- 【剑指Offer】树的子结构 解题报告(Python)
[剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除
剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...
- 【剑指offer】树的子结构
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...
- 【Java】 剑指offer(26) 树的子结构
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...
随机推荐
- Networking && Internet 计网学习笔记一
Networking && Internet 计网学习笔记一 参考书籍: James F. Kurose, Keith W. Ross. 计算机网络-自顶向下方法 (7th). 机械工 ...
- 点击获取Cesium中加载的3DTile模型的属性信息(二)
1.添加鼠标点击事件 //鼠标单击左键事件 viewer.screenSpaceEventHandler.setInputAction(function onMouseClick( click ) { ...
- word、excel、pdf等多种格式在线预览
第一种方式: 具体功能说明: http://view.xdocin.com/index.html 调用案例: <a href="http://www.xdocin.com/xdoc?_ ...
- ES6中的class对象和它的家人们
在ES6中新增了一个很重要的特性: class(类).作为一个在2015年就出了的特性, 相信很多小伙伴对class并不陌生.但是在日常开发中使用class的频率感觉并不高(可能仅限于作者),感觉对c ...
- 慧销平台ThreadPoolExecutor内存泄漏分析
作者:京东零售 冯晓涛 问题背景 京东生旅平台慧销系统,作为平台系统对接了多条业务线,主要进行各个业务线广告,召回等活动相关内容与能力管理. 最近根据告警发现内存持续升高,每隔2-3天会收到内存超过阈 ...
- 域名_服务器_IP之间的关系
目的: 近期在搞A服务器和云服务器,以及正式环境的B服务器的时候,多次搞不清楚域名,IP的关系. 现在理解看来: IP 分为内网和外网的,以A为例,A是内网的IP,然后申请下来的外网IP是B(还真忘了 ...
- 【C学习笔记】day5-2 写代码可以在整型有序数组中查找想要的数字, 找到了返回下标,找不到返回-1.(折半查找)
#include <stdio.h> #include <stdlib.h> int find(int s) { int n = 0; scanf_s("%d&quo ...
- Bug Bash测试
愿望 养成参加 Bug Bash 的习惯,就像养成到点就吃饭一样的习惯. 一.Bug Bash 名词解释 A Bug Bash is a collaborative effort across o ...
- 【剑指Offer】【树】【双向链表】二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节 ...
- windows搭建minikube环境学习Kubernates
1.使用powershell下载minikube New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force Invoke-Web ...