首页 > 其他分享 >[刷题记录Day18]Leetcode二叉树

[刷题记录Day18]Leetcode二叉树

时间:2023-08-25 23:44:05浏览次数:36  
标签:right int inorder 二叉树 root post Day18 Leetcode left

No.1

题目

找树左下角的值

思路

  • 队列,层序遍历
  • Deque既可以用作栈也可以用作队列,谨慎使用

代码

public int findBottomLeftValue(TreeNode root) {  
    Queue<TreeNode> queue = new LinkedList<>();  
    queue.add(root);  
    int result = 0; // 记录最后一行第一个元素  
  
    while (!queue.isEmpty()) {  
        int levelSize = queue.size();  
        for (int i = 0; i < levelSize; i++) {  
            TreeNode temp = queue.poll();  
            if (i == 0)  
                result = temp.val;  
            if (temp.left != null) {  
                queue.add(temp.left);  
            }  
            if (temp.right != null) {  
                queue.add(temp.right);  
            }  
        }  
    }  
  
    return result;  
}

No.2

题目

路径总和

思路

  • 递归
  • 注意:非子结点curVal >= targetSum就一定没有必要寻找了吗?不见得,可能有负数的节点值

递归思路

  1. 返回值:boolean,参数:节点,当前路径值,target
  2. 终止逻辑:当前节点是叶子节点,发现当前路径值等于target,返回true;当前节点不是叶子节点,但路径值已经大于等于target,返回false;
  3. 单层逻辑:前序遍历,对中间节点没有操作,若存在左右节点,则递归访问左右节点。return 递归方法(左节点)||递归方法(右节点)

代码

public boolean pathSum(TreeNode node, int curVal, int targetSum) {
    if (node.left == null && node.right == null) { // 子节点  
        return curVal == targetSum;  
    }  
  
    boolean leftTree = false;  
    boolean rightTree = false;  
  
    if (node.left != null)  
        leftTree = pathSum(node.left, curVal + node.left.val, targetSum);  
    if (node.right != null)  
        rightTree = pathSum(node.right, curVal + node.right.val, targetSum);  
  
    return leftTree || rightTree;  
}  
  
public boolean hasPathSum(TreeNode root, int targetSum) {  
    if (root == null)  
        return false;  
  
    return pathSum(root, root.val, targetSum);  
}

No.3 ==

题目

从中序与后序遍历序列构造二叉树

思路

  • 递归
  • 模拟推导的过程

递归分析

代码

public TreeNode build(int[] inorder, int in_left, int in_right, int[] postorder, int post_left, int post_right, Map<Integer, Integer> inorderMap) {  
    // [left, right)  
    // 没有节点了,返回空  
    if (post_left == post_right)  
        return null;  
  
    // 从后序数组中取出最后一个元素,就是根  
    int rootVal = postorder[post_right - 1];  
    TreeNode root = new TreeNode(rootVal);  
  
    // 叶子节点  
    if (post_right - post_left == 1)  
        return root;  
  
    // 找切割点  
    int cutIndex = inorderMap.get(rootVal);  
  
    // 切割inorder,得到inorder左数组和inorder右数组  
    // 利用inorder和postorder数组的大小必定相等特性,切割postorder,得到postorder左数组和postorder右数组  
    root.left = build(inorder, in_left, cutIndex, postorder, post_left, post_left + (cutIndex - in_left), inorderMap);  
    root.right = build(inorder, cutIndex + 1, in_right, postorder, post_left + (cutIndex - in_left), post_right - 1, inorderMap);  
  
    return root;  
}  
  
public TreeNode buildTree(int[] inorder, int[] postorder) {  
    Map<Integer, Integer> inorderMap = new HashMap<>();  
    for (int i = 0; i < inorder.length; i++) {  
        inorderMap.put(inorder[i], i);  
    }  
  
    return build(inorder, 0, inorder.length, postorder, 0, postorder.length, inorderMap);  
}

标签:right,int,inorder,二叉树,root,post,Day18,Leetcode,left
From: https://www.cnblogs.com/tomatoQt/p/17658214.html

相关文章

  • [刷题记录Day11]Leetcode
    No.1题目有效的括号思路奇数个符号一定不符合分析括号不匹配的可能性第一种情况,字符串里左方向的括号多余了,所以不匹配![[brackets0.png]]第二种情况,括号没有多余,但是括号的类型没有匹配上![[brackets1.png]]第三种情况,字符串里右方向的括号多余了,所以不匹配![[brac......
  • [刷题记录Day10]Leetcode
    No.1题目用栈实现队列思路模拟一个入栈一个出栈代码classMyQueue{privateStack<Integer>stackIn;privateStack<Integer>stackOut;publicMyQueue(){stackIn=newStack<>();stackOut=newStack<>();......
  • [刷题记录Day13]Leetcode
    No.1题目滑动窗口最大值思路编写单调队列类讲解代码classMonoQue{Deque<Integer>deque=newLinkedList<>();//弹出元素时,比较当前要弹出的值是否等于队列出口的值,相等则弹出//同时判断队列此时是否为空voidpoll(intval){......
  • [刷题记录Day8]Leetcode
    No.1题目反转字符串思路双指针,从头尾向中间遍历代码publicvoidreverseString(char[]s){ chartemp; intleft=0,right=s.length-1; while(left<right){ temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}No.2......
  • [刷题记录Day9]Leetcode
    建议跳过No.1题目找出字符串中第一个匹配项的下标思路KMP代码No.2题目重复的子字符串思路KMP代码......
  • [刷题记录Day6]Leetcode哈希表
    No.1题目有效的字母异位词思路每个字符频率都相同,于是把字母表映射到长度为26的数组上代码publicbooleanisAnagram(Strings,Stringt){intlenS=s.length(),lenT=t.length();if(lenT!=lenS)returnfalse;int[]alphabet=newint[26]......
  • [刷题记录Day7]Leetcode哈希表
    No.1题目四数相加II思路很妙的办法:有四个数组A、B、C、D,用hashMap记录【A、B中数字之和】+【这些和出现的次数】,再遍历C、D中数字组合,寻找【0-C、D中数字之和】在hashMap中出现的次数,并累加本质上,这是把4个数组简化成了2个数组代码publicintfourSumCount(int[]nums1,......
  • 《算法笔记》树与二叉树专题练习
    1、复原二叉树(由前序和中序求后序)题目描述小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。输入输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写......
  • 力扣---1448. 统计二叉树中好节点的数目
    给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。「好节点」X定义为:从根到该节点X所经过的节点中,没有任何节点的值大于X的值。 示例1:输入:root=[3,1,4,3,null,1,5]输出:4解释:图中蓝色节点为好节点。根节点(3)永远是个好节点。节点4->(3,4)是路......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......