110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
输入:root = [3,9,20,null,null,15,7]
输出:true
思路一:递归
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
判断高度是否平衡,我们需要使用后序遍历,计算左子节点和右子节点的高度,如果高度差大于1则不是平衡二叉树
递归三要素:
- 确定参数和返回值 参数就是root,返回值可以用-1来标记不合符平衡树标准的
- 明确终止条件,
root==null
- 明确单层递归的逻辑 分别递归求左子树的高度和右子树的高度,再计算高度差值
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
public 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;
}
if(Math.abs(leftHeight-rightHeight)>1){
return -1;
}
return Math.max(leftHeight,rightHeight)+1;
}
}
思路二:迭代(思路复杂繁琐这里忽略了,后序遍历+层序遍历求高度)
257. 二叉树的所有路径、
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
解题思路:
-
设置空列表保存返回结果,设置一个路径空链表保存每一条路径
-
traversal函数迭代,迭代的参数为root,path(保存路径),reslut(保存最终结果)
使用前序遍历首先将中间值添加到path
迭代终止条件结点的左右子结点均为空
设置一个StringBuilder,遍历path列表将其添加到StringBuilder中,最后将每一次遍历的路径的StringBuilder添加到最终结果reslut中。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> reslut=new ArrayList<>();
if(root==null) return reslut;
List<Integer> path=new ArrayList<>();
traversal(root,path,reslut);
return reslut;
}
public void traversal(TreeNode root,List<Integer> path,List<String> reslut){
path.add(root.val);
if(root.left==null&&root.right==null){
StringBuilder sb=new StringBuilder();
for(int i=0;i<path.size()-1;i++){
sb.append(path.get(i)).append("->");
}
sb.append(path.get(path.size()-1));
reslut.add(sb.toString());
}
if(root.left!=null){
traversal(root.left,path,reslut);
path.remove(path.size()-1);
}
if(root.right!=null){
traversal(root.right,path,reslut);
path.remove(path.size()-1);
}
}
}
404. 左叶子之和
给定二叉树的根节点
root
,返回所有左叶子之和。
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
递归三要素:
-
确定参数和返回值 参数需要传入root,返回左节点之和int
-
确定终止条件
root==null
即不存在左右节点 -
明确单层递归的逻辑
当
root.left!=null&&root.left.left==null&&root.left.right==null
即为左子结点的值,我们将其分为左节点的左子节点和右结点的左子节点,分别去计算并相加。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root==null) return 0;
int left=sumOfLeftLeaves(root.left);
int right=sumOfLeftLeaves(root.right);
if(root.left!=null&&root.left.left==null&&root.left.right==null){
left=root.left.val;
}
int sum=left+right;
return sum;
}
}