首页 > 其他分享 >【代码随想录Day17】二叉树Part05|练习递归

【代码随想录Day17】二叉树Part05|练习递归

时间:2024-09-14 12:54:13浏览次数:12  
标签:root1 TreeNode val 随想录 Part05 二叉树 null root root2

654.最大二叉树

题目链接/文章讲解:代码随想录
视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili
思路和昨天的从中序与后序遍历序列构造二叉树很像,那一题是根节点对数组分割,这一题是最大元素对数组分割。

代码解释:

  1. 基本检查:如果输入数组 nums 为空,直接返回 null
  2. 找到最大值的索引:使用 getMaxIndex 方法找到数组中的最大值的索引。
  3. 创建根节点:根据最大值创建根节点。
  4. 创建左子树和右子树的数组:使用 Arrays.copyOfRange 方法分别创建左子树和右子树的数组。
  5. 递归构建左子树和右子树:分别递归调用 constructMaximumBinaryTree 方法构建左子树和右子树。
  6. 连接左子树和右子树:将构建好的左子树和右子树连接到根节点。
  7. 返回根节点:返回构建好的树的根节点。
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if (nums.length == 0) {
            return null;
        }
        int index = getMaxIndex(nums);
        TreeNode root = new TreeNode(nums[index]);
        int[] numsLeft = Arrays.copyOfRange(nums, 0, index);
        int[] numsRight = Arrays.copyOfRange(nums, index + 1, nums.length);
        TreeNode rootLeft = constructMaximumBinaryTree(numsLeft);
        TreeNode rootRight = constructMaximumBinaryTree(numsRight);
        root.left = rootLeft;
        root.right = rootRight;
        return root;
    }

    public int getMaxIndex(int[] nums) {
        int max = nums[0];
        int index = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > max) {
                max = nums[i];
                index = i;
            }
        }
        return index;
    }
}

617.合并二叉树

题目链接/文章讲解:代码随想录
视频讲解:一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树_哔哩哔哩_bilibili

解释:

  1. 合并节点值:我们首先创建一个新的 TreeNode,并根据 root1root2 的情况设置其值。
  2. 递归合并左子树:我们检查 root1root2 的左子树是否为 null,然后递归地合并它们。
  3. 递归合并右子树:我们检查 root1root2 的右子树是否为 null,然后递归地合并它们。
  4. 返回合并后的树:最后返回合并后的树的根节点。
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null && root2 == null) {
            return null;
        }
        TreeNode root = new TreeNode();
        if (root1 == null) {
            root.val = root2.val;
        } else if (root2 == null) {
            root.val = root1.val;
        } else {
            root.val = root1.val + root2.val;
        }

        // 检查 root1 和 root2 的左子树
        TreeNode left1 = (root1 != null) ? root1.left : null;
        TreeNode left2 = (root2 != null) ? root2.left : null;
        root.left = mergeTrees(left1, left2);

        // 检查 root1 和 root2 的右子树
        TreeNode right1 = (root1 != null) ? root1.right : null;
        TreeNode right2 = (root2 != null) ? root2.right : null;
        root.right = mergeTrees(right1, right2);

        return root;
    }
}

700.二叉搜索树中的搜索

题目链接/文章讲解:代码随想录
视频讲解:不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索_哔哩哔哩_bilibili

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) {
            return null;
        }
        if (root.val == val) {
            return root;
        }
        TreeNode left = root.left;
        TreeNode right = root.right;
        if (val < root.val) {
            return searchBST(left, val);
        }
        if (val > root.val) {
            return searchBST(right, val);
        }
        return null;
    }
}

98.验证二叉搜索树

题目链接/文章讲解:代码随想录
视频讲解:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili

class Solution {
    private List<Integer> vec = new ArrayList<>();

    private void traversal(TreeNode root) {
        if (root == null)
            return;
        traversal(root.left);
        vec.add(root.val); // 将二叉搜索树转换为有序数组
        traversal(root.right);
    }

    public boolean isValidBST(TreeNode root) {
        vec.clear(); // 清空列表以备重复使用
        traversal(root);
        for (int i = 1; i < vec.size(); i++) {
            // 注意要小于等于,搜索树里不能有相同元素
            if (vec.get(i) <= vec.get(i - 1))
                return false;
        }
        return true;
    }
}

标签:root1,TreeNode,val,随想录,Part05,二叉树,null,root,root2
From: https://blog.csdn.net/weixin_43724673/article/details/142254851

相关文章

  • 树和二叉树基本术语、性质
    总结二叉树的度、树高、结点数等属性之间的关系(通过王道书5.2.3课后小题来复习“二叉树的性质”)树的相关知识 叶子结点的度=0层次默认从1开始有些题目从0开始也不要奇怪常见考点1:结点数=总度数+1 常见考点2:度为m的树和m叉树 常见考点3:度为m的树第i层至多有......
  • 代码随想录算法训练营,9月14日 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差文档讲解︰代码随想录(programmercarl.com)视频讲解︰二叉搜索树的最小绝对差日期:2024-09-14想法:好好利用二叉搜索树中序遍历是有序的性质,设置一个节点表示前一个结点就能很方便的计算差值了Java代码如下:classSo......
  • 【随想录day2】LeetCode209长度最小的子数组 | LeetCode59螺旋矩阵
    LeetCode209长度最小的子数组1、题目:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和≥s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0示例:输入:s=7,nums=[2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小......
  • 【遍历二叉树】---先,中,后,层序遍历 及 先序建立整树
    0.二叉树结点的链式存储结构#include<stdio.h>#include<stdlib.h>typedefcharTElemType;//树中元素基本类型为char类型#defineboolint#definetrue1#definefalse0//二叉树结点链式存储结构(二叉链表)typedefstructBiNode{ TElemTypedata;//数据域 str......
  • 代码随想录算法训练营,9月13日 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索
    654.最大二叉树题目链接:654.最大二叉树文档讲解︰代码随想录(programmercarl.com)视频讲解︰最大二叉树日期:2024-09-13想法:根据昨天中后序列构造二叉树的经验,要找到数组中的最大值的位置,可以设置两个指针表示子树的范围(左闭右开)Java代码如下:classSolution{publicTreeNo......
  • 重生之我在代码随想录刷算法第一天 | 704.二分查找、27.移除元素
    参考文献链接:代码随想录本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。704.二分查找力扣题目链接解题思路这道题明确规定了数组是有序并且不重复的,要在这样的数组中寻找一个给定值的位置不由得让我想起来以前的数学知识二分查找。所以很快确定了思路......
  • 代码随想录算法 - 二叉树3
    题目1513.找树左下角的值给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,null,null,7]输出:7提示:二叉树的节点个数的范围是[1,104]-......
  • leetcode刷题day17|二叉树Part05(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的
    654.最大二叉树构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。递归三步曲:1、传入参数,整数数组,数组的开始和结束,返回树的中间节点。2、终止条件:开始大于等于结束,即数组为空。3、递归逻辑:找到最大的元素,记录元素其下标,构建中间节点;递归构造......
  • 【数据结构】第八节:链式二叉树
    个人主页: NiKo数据结构专栏: 数据结构与算法 源码获取:Gitee——数据结构一、二叉树的链式结构typedefintBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinaryTreeNode*left;//左子树根节点 structBinaryTreeNode*right;//右子......
  • 代码随想录突击版刷题
    704.二分查找https://leetcode.cn/problems/binary-search/description/ 59.螺旋矩阵II https://leetcode.cn/problems/spiral-matrix-ii/description/、参考题解写出54.螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/description/classSolution{public:......