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是树的高度),
}