- 左叶子之和(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.leftnull && 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.leftnull && root.rightnull&&flag-1){
sum+=root.val;
}
}
-
二叉树的所有路径(LeetCode 257)
目标:找出给定二叉树的所有从根节点到叶子节点的路径。
思路:
使用深度优先搜索(DFS)遍历二叉树。
在递归过程中,将当前节点的值添加到路径列表 path 中。
当到达叶子节点(没有左右子节点)时,将当前路径添加到结果列表 list 中。
在回溯过程中,从 path 中移除当前节点的值。
关键点:
使用 path 列表记录当前路径的所有节点值。
在到达叶子节点时,将路径转换为字符串并添加到结果列表中。
//257. 二叉树的所有路径
public ListbinaryTreePaths(TreeNode root) {
Listlist = new ArrayList<>();
Listpath=new LinkedList<>();
if (root == null) return list;
dfs(root, list, path);
return list;
}
private void dfs(TreeNode root,Listlist,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);
} -
平衡二叉树(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;
}