代码随想录算法训练营第十七天|110.平衡二叉树 、257. 二叉树的所有路径 、404.左叶子之和

●  110.平衡二叉树 

题目链接:https://leetcode.cn/problems/balanced-binary-tree/

解答:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html#google_vignette

一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。


●  257. 二叉树的所有路径 

题目链接:https://leetcode.cn/problems/binary-tree-paths/

解答:

https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。


前序遍历以及回溯的过程

回溯:递归和回溯是同时进行的,所以需要放在同一个花括号里

paths.remove(paths.size()-1)

进入左右子树需要回溯

找到一条路径以后,要存储:

StringBuffer sPath = new StringBuffer();//初始化

            for(int i=0; i<path.size()-1;i++){

                sPath.append(Integer.toString(path.get(i)));

                sPath.append("->");

            }

            sPath.append(Integer.toString(path.get(path.size()-1)));//最后一个单独添加

            result.add(sPath.toString());


●  404.左叶子之和

题目链接:https://leetcode.cn/problems/sum-of-left-leaves/

解答:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html

左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子:如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子

if (node.left !=null && node.left.left==null && node.left.right==null){

                sum+= node.left.val;

            }

递归法:

1. 确定递归的终止条件

2. 先计算左边所有左子叶的节点和

3. 判断这个节点为父节点是否存在左子叶 如果存在 将其值加上

4. 计算右边所有左子叶的节点和

5.所有左子叶节点和相加并返回

迭代法:

使用中、前、后序遍历,前序和后序遍历的写法没有本质却别,只是改变了入栈顺序并做了一个反转

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容