适合深度遍历的🌲

77 阅读2分钟

1、最大路径和

class Solution {
    //思路:后序遍历,从下到上找每个节点的最大路径和
    int max = Integer.MIN_VALUE; //记录当前的最大路径和
    public int maxPathSum(TreeNode root) {
        findMaxPathSum(root);
        return max;
    }
    //返回当前node为root的最大路径和
    public int findMaxPathSum(TreeNode node){
        if(node == null) return 0;
        //计算左子树最大路径和,为负数则取0
        int leftMax = findMaxPathSum(node.left);
        int left = Math.max(leftMax, 0);
        //计算右子树最大路径和,为负数则取0
        int rightMax = findMaxPathSum(node.right);
        int right = Math.max(rightMax, 0);
    //更新最大路径和:当前的max VS 当前节点加上其左子树和右子树的和
        max = Math.max(max, node.val + left + right);
    //返回有3种可能:当前节点值、当前节点+左子树路径、当前节点+右子树路径
        return node.val + Math.max(left, right);
    }
}

2、验证二叉搜索树

class Solution {
//思路:二叉搜索树中序遍历,结果是递增的。可以比较当前节点值和前一个节点值,来判断是否满足。
    long pre = Long.MIN_VALUE; //定义全局变量pre,存储前一个节点的值
    //在方法中采用中序遍历判断是否BST
    public boolean isValidBST(TreeNode root) {
        //空树算二叉搜索树吗?
        if (root == null) return true;
    //访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
    //访问当前节点:如果当前节点 <= 中序遍历的前一个节点,说明不是二叉搜索树
        if (root.val <= pre) {
            return false;
        }
        //当前节点>前一个节点,则当前节点为根的树,是二叉搜索树,更新pre值
        pre = root.val;
    // 访问右子树
        return isValidBST(root.right);
    }
}

3、翻转二叉树

class Solution {
    //通过递归,从下往上地处理节点
    //翻转某节点的左右子树时,要保证它左右子树内各节点已经翻转好了。
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        // 递归翻转子树,分别得到翻转后的左、右子树
        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);
        //将翻转后的左子树赋值给当前节点的右子树
        root.right = left;
        //将翻转后的右子树赋值给当前节点的左子树
        root.left = right;
        // 返回翻转后的当前节点
        return root; 
    }
//时间复杂度:O(n)每个元素都必须访问一次
//空间复杂度:最坏的情况下,需要存放 O(h)个函数调用(h是树的高度),
}