20210330:二叉树力扣相关习题复习(上)

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

    1. 路径总和 II
    1. 二叉树的最近公共祖先
    1. 二叉树展开为链表

思路与算法

    1. 路径总和 II:经典三序遍历二叉树题目,需要保存路径,熟悉流程
    1. 二叉树的最近公共祖先:变相的求路径的题目,巩固遍历的技巧,最后只需要从短的路径头开始同步遍历即可,相同的路径会不断覆盖res直至最近公共祖先节点。
    1. 二叉树展开为链表:时间原因,投机取巧使用了vector保存前序遍历的路径,再进行相邻节点的连接即可完成链表。

代码实现

  1. 路径总和 II
    java版本:从给定的target中做减法
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<List<Integer>> pathSum(TreeNode root, int sum) {// 新建结果集List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}// 双端队列来存放对应的路径数组Deque<Integer> path = new ArrayDeque<>();pathSum(root, sum, path, res);return res;}public void pathSum(TreeNode node, int sum, Deque<Integer> path, List<List<Integer>> res) {// 递归终止条件if (node == null) {return;}// 从当前sum中减去当前节点的值,再将减去的这个节点值添加到path队列存放sum -= node.val;path.addLast(node.val);if (sum == 0 && node.left == null && node.right == null) {// path 全局只有一份,必须做拷贝res.add(new ArrayList<>(path));// 注意:这里 return 之前必须重置path.removeLast();return;}pathSum(node.left, sum, path, res);pathSum(node.right, sum, path, res);// 递归完成以后,必须重置变量path.removeLast();}
}

cpp版本:从0开始计算path和

/*** 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:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int>> res;vector<int> path;int path_value = 0;preOrder(root,path_value,targetSum,path,res);return res;}
public:void preOrder (TreeNode* node,int &path_value,int targetSum,vector<int> &path,vector<vector<int>> &res) {if (!node) {return;}path_value += node->val;path.push_back(node->val);if (!node->left && !node->right && path_value == targetSum) {res.push_back(path);}preOrder(node->left,path_value,targetSum,path,res);preOrder(node->right,path_value,targetSum,path,res);path_value -= node->val;path.pop_back();}
};
  1. 二叉树的最近公共祖先
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode*> path;vector<TreeNode*> p_path;vector<TreeNode*> q_path;int flag = 0;preOrder(root,p,path,p_path,flag);path.clear();flag = 0;preOrder(root,q,path,q_path,flag);int path_len = 0;if (p_path.size() < q_path.size()) {path_len = p_path.size();} else {path_len = q_path.size();}TreeNode* res = NULL;for (int i = 0; i < path_len; ++i) {if (p_path[i] == q_path[i]) {res = p_path[i];}}return res;}   private:// 尽量不使用全局变量void preOrder(TreeNode* node,TreeNode* search,vector<TreeNode*> &path,vector<TreeNode*> &res,int &flag){if (!node || flag == 1) {return;}path.push_back(node);if (node == search) {flag = 1;res = path;}preOrder(node->left,search,path,res,flag);preOrder(node->right,search,path,res,flag);path.pop_back();}
};
  1. 二叉树展开为链表
/*** 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 flatten(TreeNode* root) {vector<TreeNode*> node_vec;preOrder(root,node_vec);for (int i = 1;i < node_vec.size(); ++i) {node_vec[i - 1]->left = NULL;node_vec[i - 1]->right = node_vec[i];}}
private:void preOrder (TreeNode* node,vector<TreeNode*> &node_vec) {if (!node) return;node_vec.push_back(node);preOrder(node->left,node_vec);preOrder(node->right,node_vec);}
};

写在最后

  1. 三月最后一天了,本月状态很一般,继续调整状态,忙起来就好了。

20210330:二叉树力扣相关习题复习(上)相关推荐

  1. 20200724:力扣197周周赛上

    力扣197周周赛上 题目 思路与算法 代码实现 复杂度分析 题目 好数对的数目 仅含 1 的子串数 思路与算法 第一题直接暴力或者使用map来存值,注意到我们只需要找到这个数字出现的次数num,那么其 ...

  2. 20200705:力扣196周周赛上

    力扣196周周赛上 题目 思路与算法 代码实现 复杂度分析 判断能否形成等差数列 题目 所有蚂蚁掉下来前的最后一刻 请注意仔细看给的示例: 思路与算法 题目给定了数组长度大于等于2,也就是说,先排序, ...

  3. 20200701:力扣194周周赛上

    力扣194周周赛上 题目 思路与算法 代码实现 复杂度分析 题目 数组异或操作 保证文件名唯一 注意这个示例: 思路与算法 半个月没写博客了,太懒了,不能再拖延了,今天开始全部带上C++和Java的双 ...

  4. 20200616:力扣193周周赛上

    力扣193周周赛上 题目 思路与算法 代码实现 写在最后 题目 一维数组的动态和 不同整数的最少数目 思路与算法 第一题没啥好说的,动态和,dp最基础的东西. 第二题主要是一个贪心的过程,既然要剩下的 ...

  5. 20200612:力扣192周周赛上

    力扣192周周赛上 题目 思路与算法 代码实现 复杂度分析 题目 1. 重新排列数组 2. 数组中的k个最强值 思路与算法 第一题不需要太多思路,最简单的就是list,list将要求的顺序的数依次收入 ...

  6. 20200505:力扣151周周赛上

    力扣151周周赛上 题目 思路与算法 代码实现 题目 查询无效交易 2.比较字符串最小字母出现频次 思路与算法 第一题直接将我们需要的这四组数据包装成一个Transaction对象,主要是注意书写问题 ...

  7. 20200503:力扣187周周赛上

    力扣187周周赛上 题目 思路与算法 代码实现 复杂度分析 题目 旅行终点站 是否所有 1 都至少相隔 k 个元素 思路与算法 第一题我没做出来,说来惭愧,菜的离谱.看大神的题解豁然开朗,这题类似之前 ...

  8. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  9. 算法面试不懂这6大数据结构知识一定挂!(附力扣LeetCode真题讲解)

    本文作者:苏勇,Google 资深技术工程师 首发地址:https://mp.weixin.qq.com/s/u8pvmupISQ5D4kGIkgfKbA 在互联网行业的算法面试中经常会被考到数据结构 ...

最新文章

  1. 5G+AI重新定义生老病死?
  2. 极限编程与敏捷开发(4)
  3. 微博计数:从关系服务到访问计数, Redis 持续优化支撑万亿级访问(含 PPT)
  4. SpringBoot:Unable to start LiveReload server(已解决)
  5. 编译openjdk时cygwin需要下载的内容
  6. java流水号_Java生成流水号
  7. Vivado ROM IP核
  8. P2756 飞行员配对方案问题【二分匹配】【网络流Dinic、EK详解】【萌新初写】
  9. 中国互联网杀毒软件的简要发展历史
  10. 计算机教学拼音打字教案,sogo拼音输入法教案.doc
  11. 服务器cpu型号知识普及,小白进阶教程 十个问题看懂CPU该如何选
  12. 清凉-明智左马介秀满的一生
  13. 创新之法,法无常法——小鹏汽车访学笔记
  14. Spring系列之依赖注入的三种方式
  15. PHP API 接口文档生成 简单版本 基于一位大哥的代码改的
  16. 把圆形放入矩形的Packing问题
  17. 中国软件:10个人 , 20年坎坷路!
  18. LXD 2.0系列之二:LXD安装和配置
  19. Python 通过 STMP 发送邮件(云服务器可用)
  20. Excel VBA初级系列培训--课时3

热门文章

  1. 推荐系统如何一键实现工业级部署? ElasticCTR 百度开讲
  2. 你有进一步深入理解二分查找吗?
  3. 方舟编译器开源技术沙龙北京站首秀:让开源激活软件开发的潜力
  4. 如何战胜软件开发的复杂性?
  5. 直接拿来用!前端如何快速实现跨平台开发?
  6. 112654 个招聘数据告诉你,程序员 2019 年该去哪!
  7. 绝杀《绝地求生》外挂!
  8. 苹果说:没错,我就是故意让旧 iPhone 变慢的!
  9. 服务器link系统命令,可以使用命令(7)来查看网络接口的运行情况。输入该命令后,系统的输出信息如下。...
  10. 2018年秋计算机应用基础本科,广东开放大学远程教育专科2018年秋计算机应用基础Word模块测试...