110.平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
private int getHeight(TreeNode root){
if(root==null){
return 0;
}
int leftHeight = getHeight(root.left);
if(leftHeight==-1){
return -1;
}
int rightHeight = getHeight(root.right);
if(rightHeight==-1){
return -1;
}
if(Math.abs(leftHeight-rightHeight)>1){
return -1;
}
return Math.max(leftHeight,rightHeight)+1;
}
}
后序遍历的思想
257.二叉树的所有路径
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
if(root==null){
return res;
}
List<Integer> paths = new ArrayList<>();
traversal(root,paths,res);
return res;
}
private void traversal(TreeNode root, List<Integer> paths, List<String> res){
paths.add(root.val);
// 遇到叶子节点
if(root.left==null&&root.right==null){
StringBuilder sb = new StringBuilder();
for(int i=0;i<paths.size()-1;i++){
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size()-1));
res.add(sb.toString());
return;
}
if(root.left!=null){
traversal(root.left,paths,res);
paths.remove(paths.size()-1);//回溯
}
if(root.right!=null){
traversal(root.right,paths,res);
paths.remove(paths.size()-1);//回溯
}
}
}
回溯的思想
404. 左叶子之和
给定二叉树的根节点
root
,返回所有左叶子之和。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root==null){
return 0;
}
int leftValue = sumOfLeftLeaves(root.left);
int rightValue = sumOfLeftLeaves(root.right);
int midValue = 0; // 只能通过父节点来判断子节点是不是左叶子
if(root.left!=null&&root.left.left==null&&root.left.right==null){
midValue = root.left.val;
}
return leftValue + rightValue + midValue;
}
}
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
需要通过父节点来判断子节点是不是叶子节点