今日主要题目
主要学习网址
做题思路与具体代码
题目一:110.平衡二叉树
做题思路
本题采用递归+后序解法,先算左右子树深度,深度差绝对值大于1就不是平衡二叉树,每次取左右子树最大深度
具体代码
class Solution {
public boolean isBalanced(TreeNode root) {
if(getheight(root)==-1)return false;
else return true;
}
//获得深度
public int getheight(TreeNode root){
//递归+后序
//注意时刻判断
//终止条件
if(root==null)return 0;
//初始化左右子树高度
int left=0;
int right=0;
left=getheight(root.left);
//如果左边不满足直接返回-1
//把-1向上传递
if(left==-1)return -1;
right=getheight(root.right);
//如果右边不满足直接返回-1
//把-1向上传递
if(right==-1)return -1;
//左右子树高度差大于1,返回-1
if (Math.abs(left - right) > 1)return -1;
//返回最大深度
return Math.max(left,right) + 1;
}
}
题目二:257. 二叉树的所有路径
做题思路
递归+前序+回溯,采用两个集合来进行递归,这种类似题,中间集合用来收集中间结点,当遍历到根节点的时候,进行收集,需要用前序,记得回溯的这个流程
这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。
具体代码
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
//本题采用递归+前序+回溯
//初始化结果集合
List<String> result=new ArrayList<>();
//初始化中间集合
List<Integer> middle=new ArrayList<>();
//极端情况
if(root==null)return result;
//对结果集合修改
getRoute(root,result,middle);
return result;
}
//修改子树路径
public void getRoute(TreeNode root,List<String> result,List<Integer> middle){
//插入中间节点(前序)
middle.add(root.val);
//如果左右节点都为空,证明是叶子节点,那么遍历中间集合
//插入结果集合
if(root.left==null&&root.right==null){
// 用StringBuilder拼接字符串,速度更快
StringBuilder sb=new StringBuilder();
for (int i = 0; i < middle.size() - 1; i++) {
sb.append(middle.get(i)).append("->");
}
// 记录最后一个节点
sb.append(middle.get(middle.size() - 1));
// 收集一个路径
result.add(sb.toString());
}
//左节点顺序
if(root.left!=null){
//左递归
getRoute(root.left,result,middle);
//回溯,去掉上个加入的数
middle.remove(middle.size() - 1);
}
//右节点顺序
if(root.right!=null){
//右递归
getRoute(root.right,result,middle);
//回溯,去掉上个加入的数
middle.remove(middle.size() - 1);
}
//这是前序,最终不用汇总
}
}
题目三:404.左叶子之和
做题思路
本题采用递归+后序计算和,上一道题是求路径,需要前序,这一题求和
注意做左叶子就是在遍历到左根节点的时候,对值进行一个相加
具体代码
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
//本题采用递归+后序方法
//左子树的左叶子之和+右子树的左叶子之和
//极端条件(两个)
//节点为空
if(root==null)return 0;
//叶子节点
if(root.left==null&&root.right==null)return 0;
//后序顺序:左右中
//左子树的左叶子之和
int leftsum=sumOfLeftLeaves(root.left);
//如果此时左节点就是叶子节点,就直接赋值左节点的值,如果不是就用上面递归的值
if(root.left!=null&&root.left.left==null&&root.left.right==null){
//记住是左节点的值
leftsum=root.left.val;
}
//右子树的左叶子之和
int rightsum=sumOfLeftLeaves(root.right);
//结果是左子树的左叶子之和+右子树的左叶子之和
return leftsum+rightsum;
}
}