核心:左右子树的高度不超过1
如果不是平衡二叉树,则返回-1.通过是否是-1来判断是否是平衡二叉树
求高度,采用后续遍历。
再复习一下后续遍历的思想,可以将左右子树的情况给到根节点做判断。
class Solution {
public boolean isBalanced(TreeNode root) {
int res = getHeight(root);
if(res==-1) return false;
return true;
}
private int getHeight(TreeNode root){
if(root==null){
return 0;
}
int leftHeigh = getHeight(root.left);
if(leftHeigh==-1) return -1;
int rightHeigh = getHeight(root.right);
if(rightHeigh==-1) return -1;
int res;
if(Math.abs(rightHeigh-leftHeigh)>1) {
res = -1;
}else{
return 1+Math.max(leftHeigh,rightHeigh);
}
return res;
}
}
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
List<Integer> paths = new ArrayList<>();
tarversal(root,paths,result);
return result;
}
private void tarversal(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){
tarversal(root.left,paths,res);
paths.remove(paths.size()-1);//回溯
}
//右
if(root.right!=null){
tarversal(root.right,paths,res);
paths.remove(paths.size()-1);//回溯
}
}
}
注意左叶子的节点需要注意root.left.left和root.right.rihgt都为null才是叶子
就是这里后续遍历的逻辑,比卡哥的简洁一点吧,可以写到left和right后面
这个自己对比卡哥的,再体会一下。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root==null){
return 0;
}
int left=sumOfLeftLeaves(root.left);
int right=sumOfLeftLeaves(root.right);
int sum =0;
if(root.left!=null&&root.left.left==null&&root.left.right==null){
sum+=root.left.val;
}
return sum+left+right;
}
}