算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和
算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和
平衡二叉树
110. 平衡二叉树 - 力扣(LeetCode)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
递归法
- 明确递归函数的参数和返回值
参数:当前传入节点。
返回值:以当前传入节点为根节点的树的高度。
- 明确终止条件
递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0.
- 明确单层递归的逻辑
如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
分别求出其左右子树的高度,然后如果差值小于等于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
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
递归法
- 递归函数函数参数以及返回值
要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值.
- 确定递归终止条件
当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。
- 确定单层递归逻辑
因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进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
,返回所有左叶子之和
递归法
- 确定递归函数的参数和返回值
判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int
使用题目中给出的函数就可以了。
- 确定终止条件
如果遍历到空节点,那么左叶子值一定是0,注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0
- 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
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 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和相关推荐
- [二叉树|深搜|dfs] leetcode 404 左叶子之和
[二叉树|深搜|dfs] leetcode 404 左叶子之和 1.题目 题目链接 计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 ...
- Suzy找到实习了吗Day 17 | 二叉树进行中:110. 平衡二叉树,257 二叉树的所有路径,404. 左叶子之和
110. 平衡二叉树 题目 判断一颗二叉树是否是平和二叉树:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 我的错误trial 我通过写了一个函数(后序遍历 ...
- 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...
- 算法----左叶子之和
题目 计算给定二叉树的所有左叶子之和.示例:3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24来源:力扣(LeetCode) 链接:https://lee ...
- 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...
- 一棵二叉树的中根线索二叉树_二叉树面试题刷题模板(终极版)
树结构 二叉树的最大深度 后序递归 二叉树最小深度 后序递归 二叉树的直径 后序递归 平衡二叉树 后序递归 小总结 对称的二叉树 递归解法 二叉树的镜像 后序递归 树的子结构 递归解法 二叉搜索树的最 ...
- 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树
算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...
- _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树
_32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...
- 【数据结构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 ...
最新文章
- Spark- 使用第三方依赖解析IP地址
- 福师计算机应用基础离线作业一答案,18秋福师《计算机应用基础》在线作业一答案...
- boost::process::async_pipe相关的测试程序
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
- Java 算法 字串统计
- 什么是Python中的类型转换?
- 科学家之殁,竟是区块链之过?
- css布局-margin溢出
- java代码 软件_适合新手的java代码编写软件有哪些?
- 图论与复杂网络建模工具Networkx的四种网络模型
- 计算机机房设备使用管理,机房设备使用管理制度
- 瞬间移动(c(n, m))
- IDEA 安装字体 安装JetBrains Mono字体
- ES系列:解决Cluster state has not been recovered yet, cannot write to the [null] index问题
- eventlet 协程
- 网络原理4 数据链路层
- 小福利,教大家用excel函数实现切片器的功能
- js的NaN和isNaN
- [每日100问][2011-10-11]iphone开发笔记,今天你肿了么
- 战地之王大逃杀手机吃鸡