力扣labuladong——一刷day46

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [一、力扣971. 翻转二叉树以匹配先序遍历](#一、力扣971. 翻转二叉树以匹配先序遍历)
  • [二、力扣987. 二叉树的垂序遍历](#二、力扣987. 二叉树的垂序遍历)
  • [三、力扣666. 路径总和 IV](#三、力扣666. 路径总和 IV)

前言


二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「遍历」的思维。

一、力扣971. 翻转二叉树以匹配先序遍历

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> res = new ArrayList<>();
    int[] voyageArr;
    int i = 0;
    boolean flag = true;
    public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {
        voyageArr = voyage;
        fun(root);
        if(flag == false){
            List<Integer> list = new ArrayList<>();
            list.add(-1);
            return list;
        }
        return res;
    }
    public void fun(TreeNode root){
        if(root == null){
            return;
        }
        if(root.val != voyageArr[i++]){
            flag = false;
            return;
        }
        if(root.left != null && root.left.val != voyageArr[i]){
            res.add(root.val);
            TreeNode temp = root.left;
            root.left = root.right;
            root.right = temp;
        }
        fun(root.left);
        fun(root.right);
    }
}

二、力扣987. 二叉树的垂序遍历

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    class Triple{
        TreeNode node;
        int row, col;
        public Triple(TreeNode node, int row, int col){
            this.node = node;
            this.row = row;
            this.col = col;
        }
    }
    LinkedList<List<Integer>> res = new LinkedList<>();
    List<Triple> nodes = new ArrayList<>();
    public List<List<Integer>> verticalTraversal(TreeNode root) {
        traverse(root,0,0);
        Collections.sort(nodes, (tri1,tri2)->{
            if(tri1.col != tri2.col){
                return tri1.col - tri2.col;
            }else if(tri1.row != tri2.row){
                return tri1.row - tri2.row;
            }else{
                return tri1.node.val - tri2.node.val;
            }
        });
        int pre = Integer.MIN_VALUE;
        for(int i = 0; i < nodes.size(); i ++){
            Triple cur = nodes.get(i);
            if(cur.col != pre){
                res.addLast(new LinkedList<Integer>());
                pre = cur.col;
            }
            res.getLast().add(cur.node.val);
        }
        return res;
    }
    public void traverse(TreeNode root, int row, int col){
        if(root == null){
            return ;
        }
        nodes.add(new Triple(root,row,col));
        traverse(root.left, row+1, col-1);
        traverse(root.right, row+1, col + 1);
    }
}

三、力扣666. 路径总和 IV

java 复制代码
class Solution {
    Map<Integer,Integer> tree = new HashMap<>();
    int sum = 0;
    public int pathSum(int[] nums) {
        for(int i = 0; i < nums.length; i ++){
            int value = nums[i]%10;
            int code = nums[i]/10;
            tree.put(code,value);
        }
        int rootCode = nums[0]/10;
        fun(rootCode,0);
        return sum;
    }
    public void fun(int code, int path){
        if(!tree.containsKey(code)){
            return;
        }
        int value = tree.get(code);
        int[] pos = decode(code);
        int depth = pos[0], id = pos[1];
        int leftCode = encode(depth+1, 2*id-1);
        int rightCode = encode(depth+1,2*id);
        if(!tree.containsKey(leftCode) && !tree.containsKey(rightCode)){
            sum += path + value;
            return;
        }
        fun(leftCode, path + value);
        fun(rightCode, path + value);
    }
    public int[] decode(int code){
        int id = code%10;
        int depth = code/10;
        return new int[]{depth,id};
    }
    public int encode(int depth, int id){
        return depth*10 + id;
    }
}
相关推荐
数智化转型推荐官15 分钟前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互19 分钟前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
KJ_BioMed1 小时前
从PDB到高亲和力分子:De novo生成式计算化学Pipeline剖析
算法·生物医药·生物科研·科研干货·化合物设计
YHHLAI1 小时前
Agent 智能体开发实战 · 第四课:完整工具集 —— 打造 AI 编程 Agent 的工具箱
人工智能·windows·microsoft
一个王同学2 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
程序员张32 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端
闲猫2 小时前
Spring AI Agentic 模式(第1部分):Agent Skills——模块化、可复用的能力
java·人工智能·spring
源图客2 小时前
云途物流API开发-鉴权认证(Java)
java·网络·python
liguojun20253 小时前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
旖-旎3 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划