用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),取决于二叉树的形状。