用java定义树:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
//一个空构造方法`TreeNode()`,用于初始化节点的默认值。
TreeNode() {}
//一个构造方法`TreeNode(int val)`,用于初始化节点的值,并设置默认的左右子节点。
TreeNode(int val) { this.val = val; }
//一个构造方法`TreeNode(int val, TreeNode left, TreeNode right)`,用于初始化节点的值、左子节点和右子节点。
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
在Java中,每个源代码文件只能包含一个公共类。这意味着在一个源代码文件中,只能有一个类被声明为公共类(使用 `public class` 关键字)。
该公共类的名称必须与文件名相匹配,以确保编译器能够正确识别和加载该类。
然而,一个源代码文件可以包含多个非公共类(非公共类没有使用 `public` 修饰符)。这些非公共类可以在同一个文件中定义,并且可以被同一个包中的其他类访问和使用。
虽然一个源代码文件只能有一个公共类,但可以在同一个项目中有多个源代码文件,每个文件都包含一个公共类。这样可以通过在不同的文件中定义不同的公共类来组织和管理代码。
总结起来,一个源代码文件只能包含一个公共类,但可以包含多个非公共类。通过使用多个源代码文件,可以在一个项目中拥有多个公共类。
题目:
算法:
我们可以很容易得判断叶子节点,但是难以判断左叶子。
可以这样判断:
20.left.left==null && 20.left != null && 20.left.right==null
这道题适合后序遍历(LRV),最后把值传到根节点。
正确代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
//首先判断root是否为空
//JAVA的if判断要用括号,无冒号
if (root == null) return 0;
//递归调用`sumOfLeftLeaves`方法计算左子树的左叶子节点
int leftnum = sumOfLeftLeaves(root.left);
//递归调用`sumOfLeftLeaves`方法计算右子树的左叶子节点
int rightnum = sumOfLeftLeaves(root.right);
//判断当前节点的左子节点是否存在,且它的左子节点和右子节点都为null。
//如果满足这个条件,说明当前节点的左子节点是一个左叶子节点,将其值赋给`midnum`。
int midnum = 0;
if (root.left != null && root.left.left == null && root.left.right == null)
midnum = root.left.val;
int sum = leftnum + rightnum + midnum;
return sum;
}
}
注意:
每次写完后面都要加“;”
每出现一个新变量,都要声明其类型
时间空间复杂度:
这段代码的时间复杂度为O(n),其中n是二叉树中的节点数量。这是因为代码使用递归方式遍历整个二叉树,每个节点都会被访问一次。
空间复杂度取决于递归调用的深度,即递归栈的大小。在最坏的情况下,如果二叉树是一个单链的斜树,递归栈的深度将是n,因此空间复杂度为O(n)。在平均情况下,递归栈的深度取决于二叉树的平衡性,通常为O(log n)。
总结起来,这段代码的时间复杂度为O(n),空间复杂度为O(n)或O(log n),取决于二叉树的形状。