110.平衡二叉树

力扣题目链接(opens new window)

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

代码随想录算法训练营第十七天|● 110.平衡二叉树  ● 257. 二叉树的所有路径  ● 404.左叶子之和 _递归

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

代码随想录算法训练营第十七天|● 110.平衡二叉树  ● 257. 二叉树的所有路径  ● 404.左叶子之和 _子树_02

返回 false 。

思路:

平衡二叉树,求的是左右子树的高度差是否小于等于1,求高度用后序遍历的方法。求深度用前序遍历方法

第一步,输入类型和返回参数 -> int getHeight(TreeNode node)

第二步,终止条件 -> node == null , return 0

第三步,递归逻辑,先计算左子树高度,如果等于-1,则返回-1;再计算右子树,最后计算他俩相减的绝对值高度差。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }

    private int getHeight(TreeNode cur){
        if(cur == null) return 0;
        int leftHeight = getHeight(cur.left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(cur.right);
        if(rightHeight == -1) return -1;

        if(Math.abs(leftHeight - rightHeight) > 1){
            return -1;
        }
        return Math.max(leftHeight, rightHeight)+1;
    }
}

257. 二叉树的所有路径

力扣题目链接(opens new window)

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例: 

代码随想录算法训练营第十七天|● 110.平衡二叉树  ● 257. 二叉树的所有路径  ● 404.左叶子之和 _子树_03

思路:

递归法,第一步:递归函数参数以及返回值

第二步:递归终止条件

第三步:确定单层递归逻辑

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();
        if(root == null) return res;
        List<Integer> paths = new ArrayList<>();
        traveral(root, paths, res);
        return res;
    }

    private void traveral(TreeNode node , List<Integer> paths, List<String> res){
        paths.add(node.val);
        if(node.left == null && node.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());
        }
        if(node.left != null){
            traveral(node.left, paths, res);
            paths.remove(paths.size()-1);
        }
        if(node.right != null){
            traveral(node.right, paths, res);
            paths.remove(paths.size()-1);
        }

    }
}

404.左叶子之和

力扣题目链接(opens new window)

计算给定二叉树的所有左叶子之和。

示例:

代码随想录算法训练营第十七天|● 110.平衡二叉树  ● 257. 二叉树的所有路径  ● 404.左叶子之和 _子树_04

思路:

递归用法,还是前序遍历的中左右顺序,首先第一步判断输入的参数值和返回值,发现可以直接用目标函数,其次终止条件肯定是root == null终止,最后判断递归循环的逻辑,一定是中左右或者左右中都行,左叶子包括,意思就是左子树的左孩子,是个叶子节点,右子树的左孩子,是个叶子节点,将数值相加即可。

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 midvalue + leftvalue+rightvalue;
    }
}