/* 回溯算法思路 */
LinkedList<Integer> res = new LinkedList<>();
// 返回前序遍历结果
public List<Integer> inorderTraversal2(TreeNode root) {
traverse(root);
return res;
}
// 二叉树遍历函数
void traverse(TreeNode root) {
if (root == null) {
return;
}
traverse(root.left);
// 中序遍历位置
res.add(root.val);
traverse(root.right);
}
public boolean isValidBST(TreeNode root) {
return isValidBST(root, null, null);
}
/* 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val */
boolean isValidBST(TreeNode root, TreeNode min, TreeNode max) {
// base case
if (root == null) return true;
// 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
if (min != null && root.val <= min.val) return false;
if (max != null && root.val >= max.val) return false;
// 限定左子树的最大值是 root.val,右子树的最小值是 root.val
return isValidBST(root.left, min, root)
&& isValidBST(root.right, root, max);
}
// 分别记录这两个被交换的节点
TreeNode first = null, second = null;
// 判断中序遍历的有序性
TreeNode prev = new TreeNode(Integer.MIN_VALUE);
public void recoverTree(TreeNode root) {
inorderTraverse(root);
int temp = first.val;
first.val = second.val;
second.val = temp;
}
void inorderTraverse(TreeNode root) {
if (root == null) {
return;
}
inorderTraverse(root.left);
// 中序遍历代码位置,找出那两个节点
if (root.val < prev.val) {
// root 不符合有序性
if (first == null) {
// 第一个错位节点是 prev
first = prev;
}
// 第二个错位节点是 root
second = root;
}
prev = root;
inorderTraverse(root.right);
}
public boolean isSameTree(TreeNode p, TreeNode q) {
// 判断一对节点是否相同
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
// 判断其他节点是否相同
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
// 检查两棵子树是否对称
return check(root.left, root.right);
}
boolean check(TreeNode left, TreeNode right) {
if (left == null || right == null) return left == right;
// 两个根节点需要相同
if (left.val != right.val) return false;
// 左右子节点需要对称相同
return check(left.right, right.left) && check(left.left, right.right);
}
// 定义:输入一个节点,返回以该节点为根的二叉树的最大深度
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftMax = maxDepth(root.left);
int rightMax = maxDepth(root.right);
// 根据左右子树的最大深度推出原二叉树的最大深度
return 1 + Math.max(leftMax, rightMax);
}
public boolean isBalanced(TreeNode root) {
maxDepth(root);
return isBalanced;
}
// 记录二叉树是否平衡
boolean isBalanced = true;
// 输入一个节点,返回以该节点为根的二叉树的最大深度
int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
// if (!isBalanced) {
// // 随便返回一个值即可,旨在结束递归
// return -666;
// }
int leftMaxDepth = maxDepth(root.left);
int rightMaxDepth = maxDepth(root.right);
// 后序遍历位置
// 如果左右最大深度大于 1,就不是平衡二叉树
if (Math.abs(rightMaxDepth - leftMaxDepth) > 1) {
isBalanced = false;
}
return 1 + Math.max(leftMaxDepth, rightMaxDepth);
}