代码随想录day17

110.平衡二叉树

思路

● 两个思路,看树是不是平衡二叉树,需要计算左子树右子树高度差,如果满足要求,再递归判断左子树和右子树是不是平衡二叉树,时间复杂度是O(n2)
● 优化:给一个函数,如果这个树是平衡二叉树,直接返回树高度,不是就返回-1,这样需要一层递归,时间复杂度是O(n)

代码

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) return true;
        if (Math.abs(getHeight(root.left) - getHeight(root.right)) > 1) return false;
        return isBalanced(root.left) && isBalanced(root.right);
    }
    private int getHeight(TreeNode root) {
        if (root == null) return 0;
        return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
    }
}

class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }
    // 这个函数是求一个二叉树的高度,如果不是平衡二叉树,直接返回-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. 二叉树的所有路径

思路

● 这个题不能用StringBuilder,因为要利用String的不变性

代码

class Solution {
    List<String> res = new ArrayList();
    public List<String> binaryTreePaths(TreeNode root) {
        deal(root, "");
        return res;
    }
    private void deal(TreeNode node, String s) {
        if (node == null) return;
        if (node.left == null && node.right == null) {
            res.add(new StringBuilder(s).append(node.val).toString());
        }
        // 保证s是不变的
        String temp = new StringBuilder(s).append(node.val).append("->").toString();
        deal(node.left, temp);
        deal(node.right, temp);
    }
}

404.左叶子之和

思路

● 注意左叶子不一定是左视图,需要看父节点的左孩子是不是叶子节点

代码

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.right == null) return 0;
        if (root.left != null && root.left.left == null && root.left.right == null) {
            midValue += root.left.val;
        }
        return leftValue + rightValue + midValue;
    }
}

你可能感兴趣的:(java,算法,数据结构)