110.平衡二叉树
题目链接:https://leetcode.cn/problems/balanced-binary-tree/submissions/
题目要求:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
🤔解题思路
采用后序遍历,收集左右子树的高度进行比较,返回较大值
/**
* 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 boolean isBalanced(TreeNode root) {
if(hight(root) == -1) return false;
return true;
}
public int hight(TreeNode node){
//递归结束的条件
if(node == null) return 0;
//求左子树的高度
int lh = hight(node.left);
//如果有一个子树不是平衡二叉树,则整个二叉树也不是平衡二叉树
if(lh == -1) return -1;
//求右子树的高度
int rh = hight(node.right);
if(rh == -1) return -1;
//如果左右子树高度差超过1,则不是平衡二叉树
if(Math.abs(lh - rh) > 1) return -1;
//返回子树的高度
return (lh > rh ? lh : rh) + 1;
}
}
257. 二叉树的所有路径
题目链接:https://leetcode.cn/problems/binary-tree-paths/submissions/
题目要求:
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
🤔解题思路
采用前序遍历,递归+回溯的思路;每遍历一个节点,就存入路径数组中,知道遍历到叶子节点时,将结果存入结果集。
💻递归+回溯
/**
* 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 {
List<String> res = new ArrayList(); //存储最终结果
List<Integer> path = new ArrayList(); //存储路径
public List<String> binaryTreePaths(TreeNode root) {
if(root == null) return null;
get(root);
return res;
}
public void get(TreeNode node){
path.add(node.val); //将当前元素加到路径中
if(node.left == null && node.right == null){ //递归结束的条件,遍历到叶子节点
//将路径转化为目标格式存入结果中
StringBuilder s = new StringBuilder();
for(int i = 0;i < path.size() - 1;i++){
s.append(path.get(i)).append("->");
}
s.append(path.get(path.size() - 1));
res.add(s.toString());
return;
}
if(node.left != null){
get(node.left);
path.remove(path.size() - 1); //回溯
}
if(node.right != null){
get(node.right);
path.remove(path.size() - 1); //回溯
}
}
}
404.左叶子之和
题目链接:https://leetcode.cn/problems/sum-of-left-leaves/submissions/
题目要求:给定二叉树的根节点 root
,返回所有左叶子之和。
🤔解题思路
只能收集左叶子节点,由于遍历到叶子节点的时候不能够判断当前节点是否为父节点的左节点,所以应该判断遍历到的节点的左节点是否为叶子节点,使用后序遍历
/**
* 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) {
//退出递归的条件
if(root == null) return 0;
if(root.left == null && root.right == null) return 0;
int lnum;
//判断该节点的左节点是否为叶子节点
if(root.left != null && root.left.left == null && root.left.right == null){
lnum = root.left.val;
}else{
lnum = sumOfLeftLeaves(root.left);
}
int rnum = sumOfLeftLeaves(root.right);
return lnum + rnum;
}
}