首页 > 编程语言 >代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树

代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树

时间:2024-09-12 22:16:33浏览次数:11  
标签:return int inorder 随想录 二叉树 TreeNode 左下角 null root

513.找树左下角的值
题目链接:513.找树左下角的值
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰找树左下角的值
日期:2024-09-12

想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。
Java代码如下:

//迭代
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        if(root != null) que.offer(root);
        int res = 0;
        while(!que.isEmpty()){
            int size = que.size();
            for(int i = 0; i < size; i++){
                TreeNode node = que.poll();
                if(i == 0){
                    res = node.val;
                }
                if(node.left != null){
                    que.offer(node.left);
                }
                if(node.right != null){
                    que.offer(node.right);
                }
            }
        }
        return res;
    }
}
//递归
class Solution {
    private int maxDeep = -1;
    private int value = 0;
    public int findBottomLeftValue(TreeNode root) {
        findLeftValue(root,0);
        return value;
    }

    private void findLeftValue (TreeNode root,int deep) {
        if (root.left == null && root.right == null) {
            if (deep > maxDeep) {
                value = root.val;
                maxDeep = deep;
            }
            return;
        }
        if (root.left != null) {
            deep++;
            findLeftValue(root.left,deep);
            deep--;
        }
        if (root.right != null) {
            deep++;
            findLeftValue(root.right,deep);
            deep--;
        }
        return;
    }
}

112. 路径总和
题目链接:112. 路径总和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰路径总和
日期:2024-09-12

想法:用减到0来判断。
Java代码如下:

class Solution {
    private boolean travel(TreeNode root, int Sum){
        if(root.left == null && root.right == null && Sum == 0) return Sum == 0;
        if(root.left != null){
            Sum -= root.left.val;
            if(travel(root.left, Sum)) return true;
            Sum += root.left.val;
        }
        if(root.right != null){
            Sum -= root.right.val;
            if(travel(root.right, Sum)) return true;
            Sum += root.right.val;
        }
        return false;
    }
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null){
            return false;
        }
        return travel(root, targetSum - root.val);
    }
}

总结:回溯很晕,还需要点时间。

106.从中序与后序遍历序列构造二叉树
题目链接:106.从中序与后序遍历序列构造二叉树
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰从中序与后序遍历序列构造二叉树
日期:2024-09-12

想法:第一步:如果数组大小为零的话,说明是空节点了;第二步:如果不为空,那么取后序数组最后一个元素作为节点元素;第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点;第四步:切割中序数组,切成中序左数组和中序右数组;第五步:切割后序数组,切成后序左数组和后序右数组;第六步:递归处理左区间和右区间。可以设置中序区间:[inorderBegin, inorderEnd),后序区间[postorderBegin, postorderEnd),相当于找到每一层的根。
Java代码如下:

//106.从中序与后序遍历序列构造二叉树
class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(postorder.length == 0){
            return null;
        }
        return build(inorder, 0, inorder.length, postorder, 0, postorder.length);
    }
    private TreeNode build(int[] inorder, int instart, int inend, int[] postorder, int poststart, int postend){
        if(postend - poststart == 0){
            return null;
        }
        int rootValue = postorder[postend - 1];
        TreeNode root = new TreeNode(rootValue);
        int i = 0;
        for(; i < inorder.length; i++){
            if(inorder[i] == rootValue){
                break;
            }
        }
        int leftinstart = instart;
        int leftiend = i;//分割点,左闭右开
        int rightinstart = i + 1;
        int rightinend = inend;

        int leftpoststart = poststart;
        int leftpostend = poststart + (i - leftinstart);//长度等于前序中的
        int rightpoststart = poststart + (i - leftinstart);//都是左闭右开
        int rightpostend = postend - 1;
        root.left = build(inorder, leftinstart, leftiend, postorder, leftpoststart, leftpostend);
        root.right = build(inorder, rightinstart, rightinend, postorder, rightpoststart, rightpostend);
        return root;
    }
}

//105. 从前序与中序遍历序列构造二叉树(思路是一样的)
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0){
            return null;
        }
        return build(inorder, 0, inorder.length, preorder, 0, preorder.length);
    }
    private TreeNode build(int[] inorder, int instart, int inend, int[] preorder, int prestart, int preend){
        if(preend - prestart == 0){
            return null;
        }
        int rootValue = preorder[prestart];
        TreeNode root = new TreeNode(rootValue);
        int i = 0;
        for(; i < inorder.length; i++){
            if(inorder[i] == rootValue){
                break;
            }
        }
        int leftinstart = instart;
        int leftinend = i;//分割点,左闭右开
        int rightinstart = i + 1;
        int rightinend = inend;

        int leftprestart = prestart + 1;
        int leftpreend = prestart + 1 + (i - leftinstart);//长度等于前序中的
        int rightprestart = prestart + 1 +(i - leftinstart);//都是左闭右开
        int rightpreend = preend;
        root.left = build(inorder, leftinstart, leftinend, preorder, leftprestart, leftpreend);
        root.right = build(inorder, rightinstart, rightinend, preorder, rightprestart, rightpreend);
        return root;
    }
}

标签:return,int,inorder,随想录,二叉树,TreeNode,左下角,null,root
From: https://www.cnblogs.com/wowoioo/p/18411199

相关文章

  • 题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++
    题目传送门:105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/每次在中序遍历序列片段中找到前序遍历序列队首,这是该层的根节点该位置左侧是左子树,右侧是右子树再......
  • 图论篇--代码随想录算法训练营第五十七天打卡| 最小生成树问题
    题目链接:53.寻宝(第七期模拟笔试)题目描述:在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将所有岛屿联通起来(注意:这......
  • Java-数据结构-二叉树-基础 (o゚▽゚)o
    文本目录:❄️一、树形结构:  ▶ 1、概念:▶ 2、特殊的概念: ▶ 3、树的表示形式:❄️二、二叉树:  ▶ 1、概念:   ▶2、两种特殊的二叉树:     ➷1)、满二叉树:      ➷ 2)、完全二叉树:  ▶3、二叉树的性质:    ➷ 1)性质一:  ......
  • 五、树和二叉树
    文章目录一、树的引入二、树的术语三、二叉树3.1二叉树的概念3.2二叉树的遍历3.3二叉树-查找指定结点3.3二叉树-删除结点3.4顺序存储二叉树3.5线索化二叉树3.5.1线索化二叉树应用案例3.5.2遍历线索化二叉树3.6二叉树的应用3.6.1堆排序(见`2022.4.5三、排序算......
  • leetcode刷题day13|二叉树Part01(递归遍历、迭代遍历、统一迭代、层序遍历)
    递归遍历思路:使用递归的方式比较简单。1、递归函数的传参:因为最后输出一个数组,所以需要传入根节点和一个容器,本来想写数组,但发现长度不能确定,所以选择list。2、终止条件:当访问的节点为空时,return3、递归函数的逻辑:先访问一个节点,递归访问其他节点144.二叉树的前序遍历......
  • leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104
    226.翻转二叉树思路:利用先序遍历递归翻转1、终止条件:节点为空,return2、参数:root3、递归函数逻辑:处理中间节点,交换;递归左孩子,递归右孩子代码如下:classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnroot;swapC......
  • Day13 二叉树part03| LeetCode 110.平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树
    110.平衡二叉树110.平衡二叉树定义:左右子树的高度差的绝对值不超过1深度:从上到下查——>前序遍历(中左右)高度:从下到上查——>后序遍历(左右中)classSolution{publicbooleanisBalanced(TreeNoderoot){if(getHeight(root)==-1)......
  • NC 序列化二叉树
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字......
  • 二叉树(上)
    目录树型结构概念二叉树概念二叉树的存储 二叉树基本操作基本变量二叉树的遍历完整代码树型结构概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树......
  • 代码随想录训练营day44|1143.最长公共子序列,1035.不相交的线, 53. 最大子序和,392.判
    1143.最长公共子序列这题并不要求连续子序列的要求是可以删除某些元素,但不能改变顺序。顺着上题的思路,这题也应该设立一个二维数组vector<vector<int>>dp(text1.size(),vector<int>(text2.size(),0));dp[i][j]表示的是以text1[i]为结尾的字符串和以text2[j]为结尾的......