树的一些常见的递归

树的递归问题在面试的过程中也是比较常见,下面对最近刷题过程中遇到的一些树的递归问题进行一个小小的总结,以后随着刷题量的增加,还是会继续在本博客中添加新的内容。


对称树问题:这是一个easy类型的题目,也就是说比较简单的题目,当时我做的时候用的方法很蠢,虽然也AC了,但是花了两毫秒,对这个问题而言是很慢的。题目的描述如下:


101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:


下面是两次提交的结果:

第一次用的蠢方法:

class Solution {List<Integer> list1 = new ArrayList();List<Integer> list2 = new ArrayList();public boolean isSymmetric(TreeNode root) {if(root == null) return true;if(root.left == null && root.right == null)return true;if(root.left == null || root.right == null) return false;pretravel1(root.left);pretravel2(root.right);return list1.equals(list2);}void pretravel1(TreeNode root){Integer x = (root != null)?root.val:null;list1.add(x);if(root == null) return;else{pretravel1(root.left);pretravel1(root.right);}}void pretravel2(TreeNode root){Integer x = (root != null)?root.val:null;list2.add(x);if(root == null) return;else{pretravel2(root.right);pretravel2(root.left);}}
}

第二次用的稍微好一点的方法:

class Solution {public boolean isSymmetric(TreeNode root) {if(root == null) return true;return symmetric(root.left,root.right);}public boolean symmetric(TreeNode left, TreeNode right){if(left == null && right == null)return true;if(left == null || right == null)return false;if(left.val != right.val)return false;return symmetric(left.left,right.right) && symmetric(right.left,left.right);}
}

Path Sum

下面是另一个关于递归的案例
112. Path Sum,这个也是比较简单的例子,我也是尽可能用最短的代码实现这个问题,下面是描述:

AC代码如下:

class Solution {public boolean hasPathSum(TreeNode root, int sum) {if(root == null) return false;if(root.left == null && root.right == null && root.val == sum)return true;return hasPathSum(root.left,sum-root.val) || hasPathSum(root.right,sum-root.val);}
}

这里的思想有点类似于分治的思想吧,要想得到一条值为sum的路径,这里减去root对应的值之外,两个子树只需要任意一个完成sum-root.val的任务就行了,然后一步一步把任务分发下去,直到到了叶子节点,如果叶子节点的值和剩下的sum值相等,就找到了一条路径。

这里犯了一个小错误,之前提交的错误代码是这样子的:
WA代码如下:

class Solution {public boolean hasPathSum(TreeNode root, int sum) {if(root == null && sum == 0)return true;if(root == null) return false;return hasPathSum(root.left,sum-root.val) || hasPathSum(root.right,sum-root.val);}
}

错就错在我把 root = null, sum = 0 ,这种情况直接忽视了,而这种情况恰好又是递归结束的标记,我改进的方式是:直接在递归结束的标记那儿改在叶子节点,问题就解决了。


Binary Tree Paths

接着来个递归,且看 257. Binary Tree Paths,这道题我看似懂了,但是感觉又没有懂,总给我似懂非懂的感觉,题目描述如下:

如果放在以前,我可能会用后序遍历非递归来解决这个问题。现在的话,感觉递归能做的就不想用代码量巨大的后序遍历非递归,能简单就简单点。AC代码如下:

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList();if(root == null)return res;if(root.left == null && root.right == null){res.add(String.valueOf(root.val));return res;}List<String> left = binaryTreePaths(root.left);for(int i=0; i<left.size(); i++)res.add(String.valueOf(root.val)+"->"+left.get(i));List<String> right = binaryTreePaths(root.right);for(int i=0; i<right.size(); i++)res.add(String.valueOf(root.val)+"->"+right.get(i));return res;}
}

这道题的解题思路,可以从代码中看出来,就不再赘述了,实在不懂的话,可以自己画一棵树跑一遍执行过程。

关于树的递归问题的一些总结相关推荐

  1. 2018南京网络赛 G. Lpl and Energy-saving Lamps (线段树非递归实现)

    线段树非递归实现.点修改下的区间查询. 注意预处理的时候要把一到十万的都进行处理一遍,因为输入的月份不一定在月份的个数之内. #include <iostream> #include &l ...

  2. 机器学习 KD树_递归_回溯_搜索(matlab实现)

    文章目录 思路 效果 待优化 代码 mian Kd_Tree_Create recursive Kd_Tree_Search Kd_Tree_Recall_Search 思路 第一个版本:链接 KD树 ...

  3. 机器学习 KD树_递归搜索(matlab实现)

    文章目录 思路 效果 代码 mian Kd_Tree_Create recursive Kd_Tree_Search 思路 第二个版本:链接 KD树基本思路: 建立KD树(Kd_Tree_Create ...

  4. LeetCode——树:递归

    LeetCode--树:递归 目录 概述 树的高度(LeetCode104) 平衡树(LeetCode110) 两节点的最长路径(LeetCode543) 翻转树(LeetCode226) 归并两棵树 ...

  5. Python Turtle画分形树理解递归

    递归思想 递归可以把一个复杂问题转化为一个与原问题相似的规模较小的问题,通过自己调用自己,找到最终解决这个问题的条件,达到判断条件时返回. 通过分形树理解递归 Python中的 turtle画图很方便 ...

  6. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  7. 树的递归遍历与递归序

    树的递归遍历 void pre(Node head) { // 先序if (head == null) return;printf("%c ", head.element);pre ...

  8. java arraylist 遍历树_Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示://菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { ...

  9. 二叉搜索树-创建最小高度树(递归)

    题意: 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 这里回忆一下二叉搜索树的概念: 对于树中的所有子树都有,左子树上的值都小于根节点的值,右子树上的值 ...

最新文章

  1. java固定资产管理系统代码_Java 固定资产管理系统(课程设计)
  2. pring Boot与MyBatista的集成
  3. 浅谈严格模式和混杂模式
  4. 005. how is RFC to backend determined - maintenance view IWFNDV_MGDEAM
  5. 上周热点回顾(2.25-3.3)
  6. 使用Secure Boot后,导致VMware无法启动虚拟机
  7. 销售订单的 状态 变更
  8. canvas绘制圆和弧(三)
  9. jenkins vue 打包特别慢_Jenkins 自动化部署
  10. WEBPACK+ES6+REACT入门(1/7)-创建webpack4.x项目
  11. 【钉钉】通过钉钉机器人抓取群消息
  12. 在一起计时器_没想到吧?快手竟然给厕所上安装了计时器,或许职场从此再无带薪拉屎...
  13. JAVA--利用Filter和session防止页面重复提交
  14. 什么计算机竞赛能保送,除了保送名校,竞赛生还得到了什么
  15. VSCode Java 代码补全插件
  16. 程序vdmagdi.exe为keil5 与 Proteus 8.6联调工具
  17. 笔记(6) —— GPIO检测高低电平
  18. 【BP回归预测】基于matlab文化算法优化BP神经网络数据回归预测【含Matlab源码 2124期】
  19. 第6篇 | Weblogic反序列化攻击不依赖日志溯源攻击时间
  20. 操作系统复试问题笔记

热门文章

  1. shell字符串操作集
  2. 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)
  3. UIView 的旋转和缩放
  4. poj - 2488 A Knight's Journey
  5. Windows系统安全从定制IP策略开始
  6. Fedora 17 安装视频
  7. 网络诈骗是大数据的“原罪”吗
  8. scikit-learn学习之贝叶斯分类算法
  9. Tomcat修改favicon.ico图标,Linux下Tomcat修改favicon.ico图标,Tomcat更换favicon.ico图标...
  10. 内存映射与DMA笔记