算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

递归法

  1. 明确递归函数的参数和返回值

参数:当前传入节点。
返回值:以当前传入节点为根节点的树的高度。

  1. 明确终止条件

递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0.

  1. 明确单层递归的逻辑

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root)!=-1;}private static int getHeight(TreeNode root) {if (root==null) return 0;int leftHeight = getHeight(root.left);if (leftHeight==-1) return -1;int rightHeight = getHeight(root.right);if (rightHeight==-1) return -1;int result;if (Math.abs(leftHeight-rightHeight)>1) result=-1;else result = Math.max(rightHeight,leftHeight)+1;return result;}
}

迭代法

class Solution {public boolean isBalanced(TreeNode root) {if (root==null) return true;Stack<TreeNode> st = new Stack<>();TreeNode node;st.push(root);while (!st.isEmpty()){node = st.pop();if (Math.abs(getHeight(node.left)-getHeight(node.right))>1)return false;if (node.left!=null)st.push(node.left);if (node.right!=null)st.push(node.right);}return true;}private static int getHeight(TreeNode root) {if (root==null) return 0;Stack<TreeNode> st = new Stack<>();TreeNode node;st.push(root);int depth = 0;int result = 0;while (!st.isEmpty()){node = st.pop();if (node!=null){st.push(node);st.push(null);depth++;if (node.left!=null)st.push(node.left);if (node.right!=null)st.push(node.right);}else {st.pop();depth--;}result = result>depth? result : depth;}return result;}
}

二叉树的所以路径

257. 二叉树的所有路径 - 力扣(LeetCode)

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

递归法

  1. 递归函数函数参数以及返回值

要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值.

  1. 确定递归终止条件

当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。

  1. 确定单层递归逻辑

因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();if (root==null){return result;}List<Integer> path = new ArrayList<>();traversal(root,path,result);return  result;}private static void traversal(TreeNode root, List<Integer> paths, List<String> res) {paths.add(root.val);if (root.left==null&&root.right==null){StringBuilder sb = new StringBuilder();for (int i = 0; i < paths.size()-1; i++) {sb.append(paths.get(i)).append("->");}sb.append(paths.get(paths.size()-1));res.add(sb.toString());}if (root.left!=null){traversal(root.left,paths,res);paths.remove(paths.size()-1);}if (root.right!=null){traversal(root.right,paths,res);paths.remove(paths.size()-1);}}
}

迭代法

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();if (root==null) return  result;Stack<TreeNode> st = new Stack<>();Stack<String> paths = new Stack<>();st.push(root);paths.push(String.valueOf(root.val));while (!st.isEmpty()){TreeNode node = st.pop();String path = paths.pop();if (node.left==null&&node.right==null){result.add(path);}if (node.left!=null){st.push(node.left);paths.push(path+"->"+String.valueOf(node.left.val));}if (node.right!=null){st.push(node.right);paths.push(path+"->"+String.valueOf(node.right.val));}}return result;}
}

左叶子之和

404. 左叶子之和 - 力扣(LeetCode)

给定二叉树的根节点 root ,返回所有左叶子之和

递归法

  1. 确定递归函数的参数和返回值

判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int

使用题目中给出的函数就可以了。

  1. 确定终止条件

如果遍历到空节点,那么左叶子值一定是0,注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0

  1. 确定单层递归的逻辑

当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。

class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root==null) return 0;if (root.left==null&&root.right==null) return 0;int leftheight = sumOfLeftLeaves(root.left);if (root.left!=null&&root.left.left==null&&root.left.right==null){leftheight = root.left.val;}int rightheight = sumOfLeftLeaves(root.right);int sum  = leftheight+rightheight;return sum;}
}

迭代法

class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root==null) return 0;int sum = 0;Stack<TreeNode> st = new Stack<>();TreeNode node;st.push(root);while (!st.isEmpty()){node = st.pop();if (node.left != null && node.left.left == null && node.left.right == null) {sum += node.left.val;}if (node.left!=null) st.push(node.left);if (node.right!=null) st.push(node.right);}return  sum;
}

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和相关推荐

  1. [二叉树|深搜|dfs] leetcode 404 左叶子之和

    [二叉树|深搜|dfs] leetcode 404 左叶子之和 1.题目 题目链接 计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 ...

  2. Suzy找到实习了吗Day 17 | 二叉树进行中:110. 平衡二叉树,257 二叉树的所有路径,404. 左叶子之和

    110. 平衡二叉树 题目 判断一颗二叉树是否是平和二叉树:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 我的错误trial 我通过写了一个函数(后序遍历 ...

  3. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径

    文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...

  4. 算法----左叶子之和

    题目 计算给定二叉树的所有左叶子之和.示例:3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24来源:力扣(LeetCode) 链接:https://lee ...

  5. 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...

  6. 一棵二叉树的中根线索二叉树_二叉树面试题刷题模板(终极版)

    树结构 二叉树的最大深度 后序递归 二叉树最小深度 后序递归 二叉树的直径 后序递归 平衡二叉树 后序递归 小总结 对称的二叉树 递归解法 二叉树的镜像 后序递归 树的子结构 递归解法 二叉搜索树的最 ...

  7. 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

    算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...

  8. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  9. 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)

    文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...

最新文章

  1. 大数据与智能算法(一-基础技术)-SMU在线学习笔记
  2. Django中HttpResponse和JsonResponse的区别和用法
  3. AI基础:第一部分提供打包下载了!
  4. proc文件(OLD)
  5. 【Python学习】 - 解决DataFrame占用内存过大问题
  6. 分享到facebook没有封面图_拾柒自制书封面图分享~
  7. 4th, Jan 2012 食物中毒惊魂
  8. linux内核剪裁 4412,itop4412开发板-Linux内核的编译
  9. Missing artifact com.sun tools.jar 1.5.0 system 解决方法
  10. vue3.0 vuex 全局变量 存储更改
  11. 关于iOS13 的一些适配
  12. Homebrew简单使用
  13. Vue项目中安装axios
  14. 推荐免费下载380套大型商业源码
  15. w3cschool算法挑战记录1-16(位移密码算法挑战)
  16. Vue - 选择器拼音快速检索目标(pinyin-match)
  17. 局域网内服务器做网站,如何在局域网内建立一个内网网站
  18. “跨次元”检测模型hold住各种画风,真人赛博,在线Demo可玩
  19. css之@media网页适配
  20. 【技巧】只改变word背景颜色,并保持其他软件背景颜色不变

热门文章

  1. 如何提升测试质量(技术篇)
  2. 免费开源的会计软件 GnuCash 3.4 发布
  3. 入门运维需要注意的一些小技巧
  4. 如何更改 SMTP 端口
  5. SQL——最大连续登录天数、当前连续登录天数、最大连续未登录天数问题、连续登陆N天用户、连续座位号
  6. LoRa扩频技术RF芯片SX1276
  7. 2023最新网站在QQ打开自动跳转浏览器打开(qq自动跳转浏览器代码)
  8. Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
  9. vxe-table 虚拟树、树形表格的使用
  10. 思科路由器ipsec lan-to-lan综合案例详解