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

有专业做网站c2c模式在我国开始于1999年的

有专业做网站,c2c模式在我国开始于1999年的,北京网站建设浩森宇特,福州有网站开发的公司吗LeetCode 513.找树左下角的值 1、题目 题目链接#xff1a;513. 找树左下角的值 给定一个二叉树的 根节点 root#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null…LeetCode 513.找树左下角的值 1、题目 题目链接513. 找树左下角的值 给定一个二叉树的 根节点 root请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 Node.val 231 - 1 2、深度优先搜索递归 思路 这道题要在二叉树的 最后一行 找到 最左边的值。 如果使用递归法如何判断是最后一行呢其实就是深度最大的叶子节点一定是最后一行。所以要找深度最大的叶子节点。 那么如何找最左边的呢可以使用前序遍历当然中序后序都可以因为本题没有中间节点的处理逻辑只要左优先就行保证优先左边搜索然后记录深度最大的叶子节点此时就是树的最后一行最左边的值。 我们使用 maxDepth 用来记录最大深度result 记录最大深度最左节点的数值。 在写递归时我们要先明确递归三部曲 确定递归函数的参数和返回值 参数必须有要遍历的树的根节点depth 用来记录当前深度maxDepth 用来记录最大深度result 记录最大深度最左节点的数值。 这里就不需要返回值了所以递归函数的返回类型为 void。 代码如下 void traversal(TreeNode* root, int depth, int maxDepth, int result)确定终止条件 当遇到叶子节点的时候就需要统计一下最大的深度了所以需要遇到叶子节点来更新最大深度。 代码如下 // 如果当前节点是叶子节点 if (root-left nullptr root-right nullptr) {// 如果当前深度大于最大深度if (depth maxDepth) {// 更新最大深度maxDepth depth;// 更新结果值为当前节点的值result root-val;}return; }确定单层递归的逻辑 在找最大深度的时候递归的过程中依然要使用回溯。 代码如下 // 如果左子节点存在 if (root-left) {// 深度加1depth;// 递归遍历左子树traversal(root-left, depth, maxDepth, result);// 回溯深度减1depth--; } // 如果右子节点存在 if (root-right) {// 深度加1depth;// 递归遍历右子树traversal(root-right, depth, maxDepth, result);// 回溯深度减1depth--; }代码 #include iostream #include climitsusing namespace std;//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) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };class Solution { public:void traversal(TreeNode* root, int depth, int maxDepth, int result) {// 如果当前节点是叶子节点if (root-left nullptr root-right nullptr) {// 如果当前深度大于最大深度if (depth maxDepth) {// 更新最大深度maxDepth depth;// 更新结果值为当前节点的值result root-val;}return;}// 如果左子节点存在if (root-left) {// 深度加1depth;// 递归遍历左子树traversal(root-left, depth, maxDepth, result);// 回溯深度减1depth--;}// 如果右子节点存在if (root-right) {// 深度加1depth;// 递归遍历右子树traversal(root-right, depth, maxDepth, result);// 回溯深度减1depth--;}return;}int findBottomLeftValue(TreeNode* root) {if (root nullptr) {return 0;}// 记录最大深度int maxDepth INT_MIN;// 记录最大深度最左节点的数值int result 0;traversal(root, 0, maxDepth, result);return result;} };int main() {Solution s;TreeNode* root new TreeNode(3);root-left new TreeNode(9);root-right new TreeNode(20);root-right-left new TreeNode(15);root-right-right new TreeNode(7);cout s.findBottomLeftValue(root) endl;return 0; }复杂度分析 时间复杂度: O(n)其中 n 是二叉树的节点数目。需要遍历 n 个节点。空间复杂度: O(n)。递归栈需要占用 O(n) 的空间。 3、深度优先搜索递归精简版 思路 在回溯的地方可以进行精简在调用traversal函数时depth加1在递归结束时再减1以确保在递归的不同层次上深度值是正确的。 代码如下 traversal(root-right, depth 1, maxDepth, result); 代码 class Solution { public:void traversal(TreeNode* root, int depth, int maxDepth, int result) {// 如果当前节点是叶子节点if (root-left nullptr root-right nullptr) {// 如果当前深度大于最大深度if (depth maxDepth) {// 更新最大深度maxDepth depth;// 更新结果值为当前节点的值result root-val;}return;}// 如果左子节点存在if (root-left) {// 递归遍历左子树这里隐藏了回溯操作在调用traversal函数时depth加1在递归结束时再减1traversal(root-left, depth 1, maxDepth, result);}// 如果右子节点存在if (root-right) {// 递归遍历右子树这里隐藏了回溯操作在调用traversal函数时depth加1在递归结束时再减1traversal(root-right, depth 1, maxDepth, result);}return;}int findBottomLeftValue(TreeNode* root) {if (root nullptr) {return 0;}// 记录最大深度int maxDepth INT_MIN;// 记录最大深度最左节点的数值int result 0;traversal(root, 0, maxDepth, result);return result;} };复杂度分析 时间复杂度: O(n)其中 n 是二叉树的节点数目。需要遍历 n 个节点。空间复杂度: O(n)。递归栈需要占用 O(n) 的空间。 4、广度优先搜索正向层序遍历 思路 使用广度优先搜索遍历每一层的节点。遍历到最后一行的第一个结点就是要找的结点。 代码 class Solution { public:int findBottomLeftValue(TreeNode* root) {// 如果根节点为空返回0if (root nullptr) {return 0;}// 创建一个队列用于层序遍历queueTreeNode* que;// 记录结果int result 0;// 将根节点入队que.push(root);// 当队列不为空时进行循环while (!que.empty()) {// 获取当前层的节点个数int size que.size();// 遍历当前层的节点for (int i 0; i size; i) {// 取出队首节点TreeNode* node que.front();// 弹出队首节点que.pop();// 如果是当前层的第一个节点更新结果if (i 0) {result node-val;}// 如果该节点有左子节点将左子节点入队if (node-left) {que.push(node-left);}// 如果该节点有右子节点将右子节点入队if (node-right) {que.push(node-right);}}}return result;} };复杂度分析 时间复杂度: O(n)空间复杂度: O(n) 5、广度优先搜索逆向层序遍历 思路 使用广度优先搜索遍历每一层的节点。在遍历一个节点时需要先把它的非空右子节点放入队列然后再把它的非空左子节点放入队列这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点的值就是最底层最左边节点的值。 代码 class Solution { public:int findBottomLeftValue(TreeNode* root) {// 如果根节点为空返回0if (root nullptr) {return 0;}// 创建一个队列用于层序遍历queueTreeNode* que;// 记录结果int result 0;// 将根节点入队que.push(root);// 当队列不为空时进行循环while (!que.empty()) {// 获取队首节点TreeNode* node que.front();que.pop();// 如果该节点有右子节点将右子节点入队if (node-right) {que.push(node-right);}// 如果该节点有右子节点将右子节点入队if (node-left) {que.push(node-left);}// 更新结果为当前节点的值result node-val;}return result;} };复杂度分析 时间复杂度: O(n)空间复杂度: O(n)
http://www.hkea.cn/news/14352808/

相关文章:

  • 从那些方面建设网站做国外购物的网站怎么发货
  • 自己弄个网站中山哪里有做网站
  • 免费公司介绍网站怎么做深圳网站seo设计
  • 昆山网站建设怎么样报网站开发培训班
  • 物流网站做那个好住房与城乡建设部网站 黑龙江
  • 李贤威wordpress建站教程成都住建局官网住建扬尘监测
  • 人事怎么做招聘网站比对分析欧美网站设计特点
  • 辽宁省建设工程信息网官网新网站有哪些做农产品的网站
  • 深圳专业画册设计机构南京seo推广
  • 网站建设 软件开发的公司seo教程论坛
  • 网站建设公司如何推广wordpress模板的网站_网页字体怎么修改?
  • 听完米课做的网站网上国网app推广效果
  • 广州黄埔网站制作山东大标网络
  • 手机网站开发开发wordpress主题 ux
  • 网站上的超链接怎么做重庆电力建设公司网站
  • 企业网站建设一条龙多少钱如何个网站做二维码
  • 网站忧化技巧wordpress会员主页
  • 自然村 网站建设seo教程自学
  • 专业的网站制作公司地址免费申请个人网站申请
  • 做网站一定要用到dw做spa的网站怎么推广
  • 怎么做淘宝网站步骤单位建设的网站属于无形资产吗
  • 做淘宝那样的网站麻烦吗网页设计代码字号px
  • 网站大全网址大全wordpress 时尚 主题
  • 广州天河建网站发布软文平台
  • 电子商务网站开发前景做外贸的经常浏览的三个网站
  • 唯样商城网站主流的网站开发框架
  • 网站开发需求式样书比较好写的电子商务论文题目
  • 网站标题写什么作用是什么意思网站搜索要怎么做
  • 简洁企业网站asp中讯高科网站建设
  • 个人网站wordpress宁波网站建设信任蓉胜网络好