654. 最大二叉树
与上一篇帖子,前中序构造二叉树的思路差不多
标准模板如下:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
int n = nums.length;
return traversal(nums, 0, n);
}
// 左闭右开
public TreeNode traversal(int[] nums, int left, int right) {
if (left >= right) {
return null;
}
int index = 0;
int maxValue = Integer.MIN_VALUE;
for (int i = left; i < right; i++) {
if (nums[i] > maxValue) {
index = i;
maxValue = nums[i];
}
}
// 建立根节点
TreeNode root = new TreeNode(maxValue);
// 左子树左端和右端
int ll = left;
int lr = index;
// 右子树左端和右端
int rl = index + 1;
int rr = right;
// 递归
root.left = traversal(nums, ll, lr);
root.right = traversal(nums, rl, rr);
return root;
}
}
待优化:
单调栈
把所有的子树都建出来,然后用单调栈再一个一个挂上去
617. 合并二叉树
妙:
返回条件
if (root1 == null) {
return root2;
}
if (root2 == null) {
return root1;
}
当一方为空时,另一方把整个子树移过去。
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null) {
return root2;
}
if (root2 == null) {
return root1;
}
root1.val += root2.val; // 中,中可以插入到这三行任意地方
root1.left = mergeTrees(root1.left, root2.left); // 左
root1.right = mergeTrees(root1.right, root2.right); // 右
return root1;
}
}
700. 二叉搜索树中的搜索
妙:
返回条件
if (root == null || root.val == val) {
return root;
}
把两种情况合二为一了
递归法:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) {
return root;
}
if (val < root.val) {
return searchBST(root.left, val);
}
if (val > root.val) {
return searchBST(root.right, val);
}
return null; // 实际不会走到这里
}
}
迭代法:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null) {
if (val < root.val) {
root = root.left;
} else if (val > root.val) {
root = root.right;
} else {
return root;
}
}
return null; // 实际不会走到这
}
}
98. 验证二叉搜索树
优化:
中序遍历转化成数组判断有序 -> 设置一个最小值,记录最小值 -> 双指针,记录上一个节点的值
易错点:
并不是所有的节点满足 root.left.val < root.val && root.val < root.right.val 就是二叉搜索树。必须得是根节点大于左子树所有节点,小于右子树所有节点。举一个反例。

不是 BST!
递归:双指针
class Solution {
TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 左
boolean left = isValidBST(root.left);
// 中
if (pre != null && pre.val >= root.val) {
return false;
}
pre = root;
// 右
boolean right = isValidBST(root.right);
return left && right;
}
}
额外方法:官解递归
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode node, long lower, long upper) {
if (node == null) {
return true;
}
if (node.val <= lower || node.val >= upper) {
return false;
}
return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
}
}
二叉树总结
构造二叉树的题目,一定用前序遍历:中左右
二叉搜索树(BST)的题目,一定是中序遍历:左中右
569

被折叠的 条评论
为什么被折叠?



