算法训练营 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. Spark- 使用第三方依赖解析IP地址
  2. 福师计算机应用基础离线作业一答案,18秋福师《计算机应用基础》在线作业一答案...
  3. boost::process::async_pipe相关的测试程序
  4. Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
  5. Java 算法 字串统计
  6. 什么是Python中的类型转换?
  7. 科学家之殁,竟是区块链之过?
  8. css布局-margin溢出
  9. java代码 软件_适合新手的java代码编写软件有哪些?
  10. 图论与复杂网络建模工具Networkx的四种网络模型
  11. 计算机机房设备使用管理,机房设备使用管理制度
  12. 瞬间移动(c(n, m))
  13. IDEA 安装字体 安装JetBrains Mono字体
  14. ES系列:解决Cluster state has not been recovered yet, cannot write to the [null] index问题
  15. eventlet 协程
  16. 网络原理4 数据链路层
  17. 小福利,教大家用excel函数实现切片器的功能
  18. js的NaN和isNaN
  19. [每日100问][2011-10-11]iphone开发笔记,今天你肿了么
  20. 战地之王大逃杀手机吃鸡

热门文章

  1. MIME type 类型大全
  2. Spring Boot 缓存使用
  3. vant里面怎么使用import引用_Vant 的引入及使用
  4. angular5学习系列之基础知识
  5. 第05天C语言(13):inculde指令
  6. Journal of Air Transport Management 航空运输管理论文
  7. 极光推送关于证书的一些问题
  8. 苏宁无人配送车昨日亮相,可自主实现电梯交互、路线规划
  9. NOIP2016 模拟赛
  10. EDK II Module Writers Guide下