当前位置: 首页 > news >正文

初级算法-树

文章目录

        • 二叉树的最大深度
          • 题意:
          • 解:
          • 代码:
        • 验证二叉搜索树
          • 题意:
          • 解:
          • 代码:
        • 对称二叉树
          • 题意:
          • 解:
          • 代码:
        • 二叉树的层序遍历
          • 题意:
          • 解:
          • 代码:
        • 将有序数组转换为二叉搜索树
          • 题意:
          • 解:
          • 代码:

二叉树的最大深度

题意:

如题

解:

简单的树搜索操作,DFS和BFS

代码:
#include<bits/stdc++.h>
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
int dfs(TreeNode* root)
{int ans=1;if(root->left!=nullptr) ans=max(ans,1+dfs(root->left));if(root->right!=nullptr) ans=max(ans,1+dfs(root->right));return ans;
}
int bfs(TreeNode* root)
{int n=0;queue<TreeNode*>q;q.push(root);while(true){queue<TreeNode*>temp;while(!q.empty()){TreeNode* nn=q.front();q.pop();if(nn->left!=nullptr) temp.push(nn->left);if(nn->right!=nullptr) temp.push(nn->right);}q=temp;n++;if(q.empty()) break;}return n;
}
int maxDepth(TreeNode* root)
{if(root==nullptr) return 0;int ans1=dfs(root);cout<<"ans1:"<<ans1<<endl;int ans2=bfs(root);cout<<"ans2:"<<ans2<<endl;return ans1;
}
int main()
{}

验证二叉搜索树

题意:

一个二叉搜索树,要求有效条件:左子树严格小于父节点,右子树严格大于父节点且,且子节点的子树也要尊称这个条件

解:

dfs标记区间,蛮好写的

中序遍历,二叉搜索树的中序遍历是递增的,,很有趣

代码:
#include<iostream>
#include<climits>
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
bool zxbl(TreeNode* root,long long &val)//longlong 中序遍历
{bool ans=true;if(root->left!=nullptr) ans&=zxbl(root->left,val);if(root->val>val) val=root->val;else ans=false;if(root->right!=nullptr) ans&=zxbl(root->right,val);return ans;
}
bool dfs(TreeNode* root,long long l,long long r)//longlong dfs 
{bool ans=true;if(root->val<=l || root->val>=r) return false;if(root->left!=nullptr){ans=dfs(root->left,l,root->val);if(!ans) return ans;}if(root->right!=nullptr){ans=dfs(root->right,root->val,r);if(!ans) return ans;}return ans;
}
bool isValidBST(TreeNode* root)
{//long long l=(long long)INT_MIN-1,r=(long long)INT_MAX+1;long long temp=(long long)INT_MIN-1;//bool ans=dfs(root,l,r);bool ans=zxbl(root,temp);cout<<ans<<endl;return ans;
}
int main()
{}

对称二叉树

题意:

一个二叉树判断是否对称

解:

成对访问就行

代码:
#include<bits/stdc++.h>
#include<climits> 
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
bool dfs(TreeNode* root1,TreeNode* root2)//dfs 递归 
{bool ans=true;if(root1==nullptr||root2==nullptr) return false;if(root1->val!=root2->val) return false;if(root1->left!=nullptr||root2->right!=nullptr) ans&=dfs(root1->left,root2->right);if(root1->right!=nullptr||root2->left!=nullptr) ans&=dfs(root1->right,root2->left);return ans;
}
typedef pair<TreeNode*,TreeNode*>PTT;
bool isSymmetric(TreeNode* root)//迭代 
{bool ans=true;PTT ptt;queue<PTT>PTT_q;PTT_q.push({root,root});while(true){queue<PTT>PTT_temp;while(!PTT_q.empty()){ptt=PTT_q.front();PTT_q.pop();if(ptt.first==nullptr||ptt.second==nullptr){ans=false;break;}if(ptt.first->val!=ptt.second->val){ans=false;break;}if(ptt.first->left!=nullptr||ptt.second->right!=nullptr) PTT_temp.push({ptt.first->left,ptt.second->right});if(ptt.first->right!=nullptr||ptt.second->left!=nullptr) PTT_temp.push({ptt.first->right,ptt.second->left});}PTT_q=PTT_temp;if(!ans||PTT_q.empty()) break;}return ans;
}
/*
bool isSymmetric(TreeNode* root)
{bool ans=dfs(root,root);cout<<ans<<endl;return ans;
}*/
int main()
{}

二叉树的层序遍历

题意:

如题

解:

BFS板子

代码:
#include<bits/stdc++.h>
#include<climits> 
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
vector<vector<int>> levelOrder(TreeNode* root)
{vector<vector<int>>ans;if(root==nullptr) return ans;queue<TreeNode*>q;q.push(root);while(true){vector<int>an;queue<TreeNode*>next;while(!q.empty()){TreeNode* temp=q.front();q.pop();an.push_back(temp->val);if(temp->left!=nullptr) next.push(temp->left);if(temp->right!=nullptr) next.push(temp->right);}ans.push_back(an);q=next;if(q.empty())break;}return ans;
}
int main()
{}

将有序数组转换为二叉搜索树

题意:

如题,需要转换成高度平衡二叉树

解:

建搜索二叉树板子add+高度平衡思维ph

为了让高度平衡,左右两边子节点数量差要小于等于1,所以每次从有序数组中取中间,然后对左右区间再建树

代码:
#include<bits/stdc++.h>
#include<climits> 
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
void add(TreeNode* node,int &nums)
{if(node->val==nums) return;if(node->val>nums){if(node->left!=nullptr) add(node->left,nums);else node->left=new TreeNode(nums);}if(node->val<nums){if(node->right!=nullptr) add(node->right,nums);else node->right=new TreeNode(nums);}
}
void ph(TreeNode* &node,int l,int r,vector<int>& nums)
{if(l>r) return;int mid=(l+r)>>1;if(node==nullptr) node=new TreeNode(nums[mid]);else{cout<<"add:"<<nums[mid]<<endl;add(node,nums[mid]);}ph(node,l,mid-1,nums);ph(node,mid+1,r,nums);
}
TreeNode* sortedArrayToBST(vector<int>& nums)
{int lg=nums.size();TreeNode* root=nullptr;ph(root,0,lg-1,nums);return root;
}
int main()
{}
http://www.lryc.cn/news/100194.html

相关文章:

  • Harbor Failed to start docker.service: Unit docker.service not found.
  • 网络安全/信息安全(黑客技术)自学笔记
  • ADB 命令结合 monkey 的简单使用,超详细
  • 级联选择框
  • 如何在3ds max中创建可用于真人场景的巨型机器人:第 5 部分
  • 【MATLAB第61期】基于MATLAB的GMM高斯混合模型回归数据预测
  • Mnist分类与气温预测任务
  • Pytorch深度学习-----神经网络的卷积操作
  • 微信小程序转抖音小程序的坑:The component <xxx> used in pages/xxx/xxx is undefined
  • Vue+element Ui的el-select同时获取value和label的方法总结
  • 乐划锁屏充分发挥强创新能力,打造内容业新生态
  • 防御第三天
  • 用JavaScript和HTML实现一个精美的计算器
  • 基于postgresl的gaussDB(DWS)地址省市区解析函数
  • 【Golang】Golang进阶系列教程--Go 语言 new 和 make 关键字的区别
  • Day 9 C++ 内存分区模型
  • STM32 CubeMX 定时器(普通模式和PWM模式)
  • mysql清除主从复制关系
  • Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
  • 【docker】docker部署nginx
  • 苍穹外卖-day08
  • 【matlab】机器人工具箱快速上手-动力学仿真(代码直接复制可用)
  • MySQL高级篇第2章(MySQL的数据目录)
  • 【通过改变压缩视频的分辨率实现高效的视频语义分割】CVPR2022论文精度
  • golang 时间工具类
  • 剑指 Offer 44.!! 数字序列中某一位的数字
  • 16K个大语言模型的进化树;81个在线可玩的AI游戏;AI提示工程的终极指南;音频Transformers课程 | ShowMeAI日报
  • Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理
  • 九五从零开始的运维之路(其二十六)
  • 29.Git版本控制工具