一、最大二叉树
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
//记录最大值的索引,左侧是左子树,右侧是右子树;
//然后记录左子树的起始和终止索引,也记录右子树的起始和终止的索引,然后递归
//循环条件(相反的就是终止索引) left < right
return build(nums, 0, nums.length - 1);
}
public TreeNode build(int[] nums, int startIndex, int endIndex) {
if(startIndex > endIndex) return null;
int index = maxElementIndex(nums, startIndex, endIndex);
TreeNode newNode = new TreeNode(nums[index]);
newNode.left = build(nums, startIndex, index - 1);
newNode.right = build(nums, index + 1, endIndex);
return newNode;
}
public int maxElementIndex(int[] nums, int startIndex, int endIndex){
int maxIndex = startIndex;
for(int i = startIndex + 1; i <= endIndex; i++){
maxIndex = nums[maxIndex] < nums[i] ? i : maxIndex;
}
return maxIndex;
}
}
二、合并二叉树
任选一棵树t1,将另外一棵树t2合并到t1上,会出现几种情况
注意递归的时传入函数为两个树对应的节点
- t1,t2对应节点都不为空,相加
- t1为空,或t2为空,使用三目运算符
- 都为空也用三目运算符,因为不影响
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null || root2 == null) {
return root1 == null ? root2 : root1;
}
return dfs(root1, root2);
}
TreeNode dfs(TreeNode r1, TreeNode r2) {
//如果r1 和 r2 中,只要有一个是null, 函数就直接返回
if (r1 == null || r2 == null) {
return r1 == null ? r2 : r1;
}
//让r1的值等于 r1和r2的值累加,再递归的计算两棵树的左节点,右节点
r1.val += r2.val;
r1.left = dfs(r1.left, r2.left);
r1.right = dfs(r1.right, r2.right);
return r1;
}
}
三、二叉搜索树
复习概念
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
//终止条件为 root为null或者等于val,结合二叉搜索树的特性来进行递归操作
if (root == null || root.val == val) return root;
return root.val < val ? searchBST(root.right, val) : searchBST(root.left, val);
}
}
四、验证二叉搜索树
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
//递归以终为始思考,二叉树的性质是 左子树 < 当前node < 右子树
//1.访问左子树,直到到达最左侧的子树,此时为 null 返回true,进行判断root.val <= pre,pre初始值是LONG.MIN_VALUE
//2.然后在当前小子树,访问当前树的右子树,
if (root == null) {
return true;
}
// 访问左子树
if (!isValidBST(root.left)) {
return false;
}
// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
if (root.val <= pre) {
return false;
}
pre = root.val;
// 访问右子树
return isValidBST(root.right);
}
}