day16 404. 左叶子之和&&257. 二叉树的所有路径&&110. 平衡二叉树

  1. 左叶子之和(LeetCode 404)
    目标:计算给定二叉树中所有左叶子节点的值之和。
    思路:
    使用深度优先搜索(DFS)遍历二叉树。
    引入一个 flag 参数来标识当前节点是位于其父节点的左侧还是右侧。对于左叶子节点,flag 为 -1。
    在递归过程中,只有当当前节点是叶子节点(没有左右子节点)且位于其父节点的左侧时,才将其值累加到 sum 中。
    关键点:
    使用成员变量 sum 来记录所有左叶子节点的值之和。
    通过 flag 参数区分左叶子节点和右叶子节点。

//404. 左叶子之和
private int sum = 0;//成员变量,记录值
public int sumOfLeftLeaves(TreeNode root) {
//int sum = 0;
int flag=0;//用于记录方向,左是-1,右是1
if (rootnull)return sum;
if (root.left
null && root.rightnull)return sum;
dfs(root,0);//根节点不可能是左叶子结点,故此时flag的值不影响结果
return sum;
}
private void dfs(TreeNode root,int flag) {
if (root.left!=null){
dfs(root.left,-1);
}
if (root.right!=null){
dfs(root.right,1);
}
if (root.left
null && root.rightnull&&flag-1){
sum+=root.val;
}
}

  1. 二叉树的所有路径(LeetCode 257)
    目标:找出给定二叉树的所有从根节点到叶子节点的路径。
    思路:
    使用深度优先搜索(DFS)遍历二叉树。
    在递归过程中,将当前节点的值添加到路径列表 path 中。
    当到达叶子节点(没有左右子节点)时,将当前路径添加到结果列表 list 中。
    在回溯过程中,从 path 中移除当前节点的值。
    关键点:
    使用 path 列表记录当前路径的所有节点值。
    在到达叶子节点时,将路径转换为字符串并添加到结果列表中。
    //257. 二叉树的所有路径
    public List binaryTreePaths(TreeNode root) {
    List list = new ArrayList<>();
    List path=new LinkedList<>();
    if (root == null) return list;
    dfs(root, list, path);
    return list;
    }
    private void dfs(TreeNode root,List list,List path) {
    path.add(root.val);
    if (root.left!=null){
    dfs(root.left,list,path);
    }
    if (root.right!=null){
    dfs(root.right,list,path);
    }
    if (root.left == null && root.right == null) {
    StringBuilder sb = new StringBuilder();
    sb.append(path.get(0));
    for (int i = 1; i < path.size(); i++) {
    sb.append("->").append(path.get(i));
    }
    list.add(sb.toString());
    }
    path.remove(path.size()-1);
    }

  2. 平衡二叉树(LeetCode 110)
    目标:判断给定的二叉树是否是平衡二叉树。
    思路:
    定义一个辅助函数 getHeight 来计算以当前节点为根的子树的高度。
    在计算高度的过程中,检查子树是否平衡。如果任一子树不是平衡的(高度差大于 1),则返回 -1。
    如果所有子树都是平衡的,返回当前子树的高度。
    关键点:
    使用递归方法计算子树高度,并在递归过程中检查平衡性。
    通过比较左右子树的高度差来判断子树是否平衡。
    //给定一个二叉树,判断它是否是平衡二叉树
    public boolean isBalanced(TreeNode root) {
    return getHeight(root) != -1;
    }
    private int getHeight(TreeNode root) {
    if (root == null) {
    return 0;
    }
    int left = getHeight(root.left);
    int right = getHeight(root.right);
    if (right == -1|| left == -1) {
    return -1;
    }
    if (Math.abs(left - right) > 1) {
    return -1;
    }
    return Math.max(left, right) + 1;
    }

posted @   123木头人-10086  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示