110.平衡二叉树
题目链接:110.平衡二叉树
思路:单层递归中的逻辑,先判断左右子树不是平衡二叉树的情况,再判断左右子树是平衡二叉树的情况。当任意节点左右孩子高度差>1时,不符合平衡二叉树条件,结果返回-1,往上一层层返回。(后序遍历)
class Solution {
public boolean isBalanced(TreeNode root) {
return geHeight(root)!=-1;
}
private int geHeight(TreeNode node){
if(node == null)return 0;
int leftHeight = geHeight(node.left);
if(leftHeight == -1){
return -1;
}
int rightHeight = geHeight(node.right);
if(rightHeight == -1){
return -1;
}
int result;
if(Math.abs(rightHeight-leftHeight)>1){
result = -1;
}else{
result = 1+Math.max(rightHeight,leftHeight);
}
return result;
}
}
257. 二叉树的所有路径
题目链接:257. 二叉树的所有路径
思路:定义一个函数传入根节点、字符串记录路径和数组记录最终值。 if判断当 root不为空,其左右孩子都为空的时候,就找到叶子节点。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> ret = new ArrayList<>();
if(root==null) return ret;
solve(root, "", ret);
return ret;
}
public void solve(TreeNode root, String cur, List<String> ret){
if(root==null) return;
cur += root.val;
if(root.left==null&&root.right==null){
ret.add(cur);
}else{
solve(root.left, cur+"->", ret);
solve(root.right, cur+"->", ret);
}
}
}
404.左叶子之和
题目链接:404.左叶子之和
思路:后序遍历,当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
if(root.left == null && root.right == null)return 0;
int leftNum = sumOfLeftLeaves(root.left);//左
if(root.left!=null && root.left.left == null && root.left.right == null){
leftNum = root.left.val;
}
int rightNum = sumOfLeftLeaves(root.right);//右
int num = leftNum + rightNum;//中
return num;
}
}