• 代码随想录算法训练营第20天|654.最大二叉树、合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树


    一、654.最大二叉树

    力扣

    1. 找终止条件:当l>r时,说明数组中已经没元素了,自然当前返回的节点为null。
    2. 每一级递归返回的信息是什么:返回的应该是当前已经构造好了最大二叉树的root节点。
    3. 一次递归做了什么:找当前范围为[l,r]的数组中的最大值作为root节点,然后将数组划分成[l,bond-1]和[bond+1,r]两段,并分别构造成root的左右两棵子最大二叉树。
    1. class Solution {
    2. public TreeNode constructMaximumBinaryTree(int[] nums) {
    3. return maxTree(nums, 0, nums.length - 1);
    4. }
    5. public TreeNode maxTree(int[] nums, int left, int right) {
    6. if(left > right) {
    7. return null;
    8. }
    9. //bond为当前数组中最大值的索引
    10. int bond = findMaxValue(nums, left, right);
    11. TreeNode root = new TreeNode(nums[bond]);
    12. root.left = maxTree(nums, left, bond - 1);
    13. root.right = maxTree(nums, bond + 1, right);
    14. return root;
    15. }
    16. public int findMaxValue(int[] nums, int left, int right) {
    17. int max = Integer.MIN_VALUE, maxIndex = left;
    18. for(int i = left; i <= right; i++){
    19. if(max < nums[i]){
    20. max = nums[i];
    21. maxIndex = i;
    22. }
    23. }
    24. return maxIndex;
    25. }
    26. }

    二、合并二叉树

    力扣

    思路:1、找终止条件:因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了啊(如果t2也为NULL也无所谓,合并之后就是NULL)。反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。

    2、每一级递归返回的信息是什么:返回的应该是当前已经合并好了二叉树的root1节点。

    3、一次递归做了什么:就是将两个二叉树上的节点值相加。

    1. class Solution {
    2. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
    3. if(root1 == null) return root2;
    4. if(root2 == null) return root1;
    5. //那么单层递归中,就要把两棵树的元素加到一起
    6. root1.val += root2.val;
    7. //递归访问
    8. root1.left = mergeTrees(root1.left, root2.left);
    9. root1.right = mergeTrees(root1.right, root2.right);
    10. //向上返回合并后的节点
    11. return root1;
    12. }
    13. }

    三、700. 二叉搜索树中的搜索

    力扣

    思路:二叉搜索树记住等于,大于,小于三个判断条件即可。递归或者迭代都可以。注意在哪里返回,需不需要接受返回值。

    1. class Solution {
    2. public TreeNode searchBST(TreeNode root, int val) {
    3. //题目说给的节点数不会为0为什么还要加不等于空,因为后面递归传入的leftright会为空
    4. if(root == null || root.val == val) {
    5. return root;
    6. }
    7. if(root.val > val) {
    8. //为神马在这里就直接return,因为如果在这左边递归找到了结果需要马上结束代码,如果不return,则后面代码还会继续执行
    9. return searchBST(root.left, val);
    10. }else if(root.val < val) {
    11. return searchBST(root.right, val);
    12. }
    13. return null;
    14. }
    15. }
    16. class Solution {
    17. // 迭代,利用二叉搜索树特点,优化,可以不需要栈
    18. public TreeNode searchBST(TreeNode root, int val) {
    19. while (root != null)
    20. if (val < root.val) root = root.left;
    21. else if (val > root.val) root = root.right;
    22. else return root;
    23. return null;
    24. }
    25. }

    四、98.验证二叉搜索树

    力扣

    思路1:自己独立写的,用中序遍历,判断是否为一个递增的序列。

    1. class Solution {
    2. public boolean isValidBST(TreeNode root) {
    3. List<Integer> path = new ArrayList<>();
    4. inorder(root, path);
    5. for(int i = 1; i < path.size(); i++) {
    6. if(path.get(i) <= path.get(i - 1)) {
    7. return false;
    8. }
    9. }
    10. return true;
    11. }
    12. public void inorder(TreeNode root, List<Integer> path) {
    13. if(root == null) return;
    14. inorder(root.left, path);
    15. path.add(root.val);
    16. inorder(root.right, path);
    17. }
    18. }

    思路2:使用了集合记录中序遍历的元素,为什么不直接在中序遍历递归的同时判断中序遍历是否是有序的呢?中序遍历,一直更新maxValue,一旦发现maxValue>= root.val,就返回false,注意元素相同时候也要返回false。 

    1. class Solution {
    2. int maxValue = Integer.MIN_VALUE;
    3. public boolean isValidBST(TreeNode root) {
    4. if(root == null) return true;
    5. boolean left = isValidBST(root.left);
    6. // 中序遍历,验证遍历的元素是不是从小到大
    7. if (maxValue < root.val) {
    8. maxValue = root.val; //
    9. }else {
    10. return false;
    11. }
    12. boolean right = isValidBST(root.right);
    13. return left && right;
    14. }
    15. }

    什么时候递归需要返回值 ?



    代码随想录

  • 相关阅读:
    智慧隧道:TSINGSEE青犀远程视频AI智能监管平台保障隧道施工安全
    网站全灰,仅需一行css代码
    SSL证书验证原理和https加密
    2.3队列
    LeetCode-775-全局倒置与局部倒置
    LeetCode笔记:Weekly Contest 318
    HDLbits: Lemmings2
    第2章 Linux的文件管理(四)
    训练营第二十九天贪心(简单题目)
    iOS编译openmp
  • 原文地址:https://blog.csdn.net/weixin_44565532/article/details/127393173