首页 > 编程语言 >【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623

【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623

时间:2024-09-17 18:22:12浏览次数:15  
标签:623 node TreeNode val 1022 int 自顶向下 节点 left

1. 力扣1022:从根到叶的二进制之和

1.1 题目:

给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。

  • 例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。

对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。

返回这些数字之和。题目数据保证答案是一个 32 位 整数。

 

示例 1:

 

edb18e8e265df8d805bec5e2813bc4b0.png

输入:root = [1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22

示例 2:

输入:root = [0]
输出:0

提示:

  • 树中的节点数在 [1, 1000] 范围内
  • Node.val 仅为 0 或 1 

1.2 思路:

dfs递归,使用列表来记录从根到叶子节点的路径。递归方法中参数k用来记录该节点在列表中的索引位置,便于到叶子节点的for循环计算。然后继续向左右子树递归,如果其左右子树都处理完了,那么就从列表中删除这个节点的值,

1.3 题解 :

/**
 * 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 {
    // 全局变量sum记录这些数字之和
    int sum;
    // 用列表来记录从根节点到叶子节点走过的路径
    List<Integer> list = new LinkedList<>();
    public int sumRootToLeaf(TreeNode root) {
        dfs(root, 0);

        return sum;
    }
    // 参数列表里的k表示这个节点的值在列表中的索引位置
    private void dfs(TreeNode node, int k) {
        if(node == null){
            return;
        }
        list.add(node.val);
        // 如果是叶子节点,就把列表的二进制数字统计加起来
        if(node.left == null && node.right == null){
            int m = 1;
            for(int i = k; i >= 0; i--){
                sum += list.get(i)*m;
                m *= 2;
            }
            
        }
        // 继续递归
        dfs(node.left, k+1);
        dfs(node.right, k+1);
        // 处理完左右孩子节点后,就将该节点从列表中删除
        list.remove(k);
    }
}

代码稍微优化的一下:

/**
 * 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 {
    // 全局变量sum记录这些数字之和
    int sum;
    // 用列表来记录从根节点到叶子节点走过的路径
    List<Integer> list = new LinkedList<>();
    public int sumRootToLeaf(TreeNode root) {
        dfs(root, 0);

        return sum;
    }
    // 参数列表里的k表示这个节点的值在列表中的索引位置
    private void dfs(TreeNode node, int k) {
        if(node == null){
            return;
        }
        list.add(node.val);
        // 如果是叶子节点,就把列表的二进制数字统计加起来
        if(node.left == null && node.right == null){
            int m = 1;
            for(int i = k; i >= 0; i--){
                sum += list.get(i)*m;
                m *= 2;
            }
        }else{
            // 继续递归
            dfs(node.left, k+1);
            dfs(node.right, k+1);
        }
        // 处理完左右孩子节点后,就将该节点从列表中删除
        list.remove(k);
        
    }
}

2. 力扣623:在二叉树中增加一行

2.1 题目:

给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。

注意,根节点 root 位于深度 1 。

加法规则如下:

  • 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
  • cur 原来的左子树应该是新的左子树根的左子树。
  • cur 原来的右子树应该是新的右子树根的右子树。
  • 如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。

示例 1:

 

59cae442312c951ba98b133c0591ae46.jpeg

输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]

示例 2

fc8f1463c5b546f599e082d217947344.jpeg

输入: root = [4,2,null,3,1], val = 1, depth = 3
输出:  [4,2,null,1,1,3,null,null,1]

 

提示:

  • 节点数在 [1, 104] 范围内
  • 树的深度在 [1, 104]范围内
  • -100 <= Node.val <= 100
  • -105 <= val <= 105
  • 1 <= depth <= the depth of tree + 1

2.2 思路:

dfs的思想,总体来说,增加一行有两种情况:

  • 在树中间增加一行。
  • 在树的最下层的叶子节点的再下一层增加一行。

第一种情况 ,比较好想到,通过dfs的参数k找到要处理的层级节点,然后处理新new的节点与该节点和父亲节点之间的关系。

第二种情况:此时node为null,跟第一种情况的代码几乎完全一样(就不需要处理new节点的孩子 节点的情况)。

2.3 题解:

/**
 * 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 {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        // 特殊情况,提前判断即可
        if(depth == 1){
            TreeNode node = new TreeNode(val);
            node.left = root;
            return node;
        }
        dfs(null, root, depth, 1, val);
        return root;
    }
    // k表示该节点在树中的位置
    private void dfs(TreeNode parent, TreeNode node, int depth, int k, int val) {
        // 当遍历到叶子节点的左右孩子的时候,如果需要在这一层添加节点的话
        // 需要作额外操作,做完操作再返回
        if(node == null){
            // 比方说叶子节点在第三层,depth在第四层,那么需要在第四层new节点
            if(depth == k){
                if(parent.left == node){
                    node = new TreeNode(val);
                    parent.left = node;
                }else{
                    node = new TreeNode(val);
                    parent.right = node;
                }
            }
            return;
        }
        // node不为null的前提下,即对于一般节点的情况
        // 需要处理新new处理出来的节点与该节点和父亲节点
        // 三者之间的关系
        // 处理完直接返回
        if(k == depth){
            TreeNode p = new TreeNode(val);
            if(parent.left == node){
                p.left = node;
                parent.left = p;
            }else{
                p.right = node;
                parent.right = p;
            }
            return;
        }
        // 如果未到时候吗,则递归左右子树
        dfs(node, node.left, depth, k+1, val);
        dfs(node, node.right, depth, k+1, val);
    }
}

 

 

标签:623,node,TreeNode,val,1022,int,自顶向下,节点,left
From: https://blog.csdn.net/2301_80912559/article/details/142309527

相关文章

  • P1022 [NOIP2000 普及组] 计算器的改良
    P1022[NOIP2000普及组]计算器的改良题解题目链接P1022[NOIP2000普及组]计算器的改良题目大意给定一个合法有解的一元一次方程,其中只包含整数系数以及+,-,=,求该方程的解。如:\(6a−5+1=2−2a\)\(−5+y=2y+6\)等。大体思路按正常解方程思路来模拟,可以将原方......
  • COMP2230/COMP6230 Algorithms
    TheUniversityofNewcastle,AustraliaSchoolofInformationandPhysicalSciencesCOMP2230/COMP6230AlgorithmsAssignment1Marks100Weight15%IndividualSubmissionviaCanvas1LearningOutcomesThisassignmentwillrequirestudentsto:Applyspecific......
  • 20240827_102249 python 认识csv格式
    目标认识csv格式制作一个csv文件示例......
  • ISO 26262中的失效率计算:IEC TR 62380-Section 18-Protection devices
    目录概要1元器件分类2失效率的计算2.1失效率预测模型2.2Base失效率的选取2.3λoverstress的计算2.3.1πI的选取2.3.2电过应力失效率的选取概要IECTR62380《电子组件、PCBs和设备的可靠性预计通用模型》是涵盖电路、半导体分立器件、光电组件、电阻器、电......
  • ISO 26262中的失效率计算:IEC TR 62380-Section 17-Displays, solid state lamps
    目录概要1元器件分类2显示器失效率的计算2.1Displays失效率预测模型2.2Base失效率2.3温度循环De-rating系数3固态灯失效率的计算3.1Solidstatelamps失效率预测模型2.2温度循环De-rating系数概要IECTR62380《电子组件、PCBs和设备的可靠性预计通用模型......
  • PAT 乙级 1022题
    题目:D进制的A+B输入两个非负10进制整数A和B(≤230−1),输出A+B的D(1<D≤10)进制数。输入格式:输入在一行中依次给出3个整数A、B和D。输出格式:输出A+B的D进制数。输入样例:1234568输出样例:1103解题思路:    首先我们需要知道如何实现进制......
  • 《计算机网络 - 自顶向下方法》阅读笔记
    《计算机网络-自顶向下方法》阅读笔记应用层、运输层、网络层、数据链路层计算机网络和因特网:因特网:​ 是一个世界范围的计算机网络,互联了全世界的计算机设备计算机设备:手机,电脑,游戏机,电视等所有这些设备都称为主机(host)或端系统(endsystem)端系统通过通信......
  • ISO 26262中的失效率计算:IEC TR 62380-Section 10-Capacitors and thermistors (NTC)
    目录概要1电容器和热敏电阻器的分类2电容器失效率的计算2.1 Fixedplastic,paper,dielectriccapacitors2.1.1 温度De-rating系数2.1.2温度循环De-rating系数 2.2 Fixedceramicdielectriccapacitors–Definedtemperaturecoefficient–ClassI 2.2.......
  • 【日记】什么时候我也能领到 9000 块钱的工资啊(623 字)
    正文明天就要放假啦!今天忙到爆炸。本来有个客户说上午来开户,结果税务局临时把他们叫走了,所以就跟下午的客户撞时间了。两个客户一起来,我见缝插针地让A走流程时给B办,总行审B的资料时给A处理后续。两个进程相互切换,差点人没给我绕晕了。我还是不擅长这种多线程操......
  • 双LIN收发器TJA1022(NXP)
    一、简述TJA1022支持2路LIN(LocalInterconnectNetwork),波特率高达20Kbd,符合LIN2.0、LIN2.1、LIN2.2、LIN2.2A、ISO17987-4:2016(12VLIN)和SAEJ2602规范。TJA1022T和TJA1022TK(SO14/HVSON14封装)与TJA1020、TJA1021、TJA1027和TJA1029引脚兼容; TJA1022HG(DHVQFN24封装)与......