一、最大二叉树
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {//记录最大值的索引,左侧是左子树,右侧是右子树;//然后记录左子树的起始和终止索引,也记录右子树的起始和终止的索引,然后递归//循环条件(相反的就是终止索引) left < rightreturn 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;}
}
二、合并二叉树
参考617. 合并二叉树 - 力扣(LeetCode)
任选一棵树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);}
}