首页 > 其他分享 >【剑指Offer】 24、二叉树中和为某一值的路径

【剑指Offer】 24、二叉树中和为某一值的路径

时间:2023-08-14 23:57:00浏览次数:35  
标签:24 结点 temp ArrayList 路径 二叉树 root 一值 size

【剑指Offer】 24、二叉树中和为某一值的路径

题目描述:

输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

解题思路:

本题实质上就是深度优先搜索。使用前序遍历的方式对整棵树进行遍历,当访问到某一个结点时,将该结点添加到路径上,并且累加该结点的值。当访问到的结点是叶结点时,如果路径中的结点值之和正好等于输入的整数,则说明是一条符合要求的路径。如果当前结点不是叶结点,则继续访问它的子结点。

当找到一条符合要求的路径之后,需要回溯进一步查找别的路径,因此,这实际上仍然是一个递归的过程,特别注意在函数返回之前要删掉当前结点,从而才可以正确的回溯。

举例:

编程实现(Java):

public class Solution {
    private ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    private lengthCompare c=new lengthCompare();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root==null)
            return res;
        ArrayList<Integer> temp=new ArrayList<>();
        FindPath(root,target,temp);
        res.sort(c);
        return res;
    }
    public void FindPath(TreeNode root,int target,ArrayList<Integer> temp){
        temp.add(root.val);
        if(root.left==null && root.right==null){ //root是叶结点
            if(root.val==target) {//找到了一条路径
                ArrayList<Integer> list=new ArrayList();
                list.addAll(temp);
                res.add(list);
            }
        }
        else{
            if(root.left!=null)
                FindPath(root.left,target-root.val,temp);
            if(root.right!=null)
                FindPath(root.right,target-root.val,temp);
        }
        if(temp.size()!=0) //回溯
            temp.remove(temp.size()-1);
    }
    class  lengthCompare implements Comparator<ArrayList>{
        public int compare(ArrayList a,ArrayList b){
            if(a.size()>b.size())
               return -1;
            else if(a.size()==b.size())
                return 0;
            else
                return 1;
        }
    }
}

标签:24,结点,temp,ArrayList,路径,二叉树,root,一值,size
From: https://www.cnblogs.com/bujidao1128/p/17630100.html

相关文章

  • 肌电传感器 SEN0240
    传感器购买连接。传感器相关信息,这个也是。传感器驱动示例代码:/**Copyright2017,OYMotionInc.*Allrightsreserved.**Redistributionanduseinsourceandbinaryforms,withorwithout*modification,arepermittedprovidedthatt......
  • 2024年秋招赛码网刷题-判断奇偶数、读取未给出行列数的矩阵
    1defis_even(n):2return1ifn%2==0else034n=int(input())56result=is_even(n)7print(result)#最后一行不能用return因为return只能在函数内部使用。在顶层代码中用return不合法 ......
  • [代码随想录]Day17-二叉树part06
    题目:654.最大二叉树思路:和前中序构造树差不多的方法,以前是返回值,现在是返回树代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNode*}*/funcconstructMaximumBinaryTree(nums[]in......
  • 二叉树
    1概念二叉树BinaryTree是n个结点的有限集合。它或者是空集n=0,或者是由一个根结点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。   76 354 21根结点根结点的左子树根结点的右子树二叉树与普通有序树不同,二叉树严格区分左子和右子,即使只有一个子结点也要区分左......
  • 二叉树的迭代遍历-栈
    二叉树的迭代遍历-栈二叉树的递归遍历书写简单,做题时能够帮助快速完成dfs但是往往有某些面试官或者题目要求,使用迭代法完成树的遍历作为复习材料,不导出推导过程,只给出核心记忆点TreeNodepublicclassTreeNode{intval;TreeNodeleft;TreeNoderight;......
  • 评测锐龙r7 6800h和酷睿i5 12450h哪个好
    AMDR76800H采用了6nm工艺,Zen3+架构,参数为8C16T,最高4.7GHz,16MBL3缓存,12CU2.2GHz核显。选i512450h还是r76800h这些点很重要!看完你就知道了http://www.adiannao.cn/dyi512450H采用Intel7工艺4大核4小核设计,拥有8核心12线程,三级缓存为12M,支持DDR5内存和PCIe5.0通......
  • 评测酷睿i5 12450h和锐龙R5 6600H选哪个
    R5-6600H配置参数:6nm的工艺,6核12线程,3.3GHz的主频,4.5GHz的睿频,三级缓存16MB,功耗TDP为45W,核显为radeon660m,6CU笔记本cpu选r56600h还是i512450h这些点很重要看过你就懂了http://www.adiannao.cn/dyi512450H采用Intel7工艺4大核4小核设计,拥有8核心12线程,三级缓存为12M,支持DDR5......
  • 二叉树的层次遍历
    #include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructTreeNode{ intdata; structTreeNode*lchild,*rchild;}TreeNode,*Tree;typedefstruct{ TreeNode*data[MaxSize]; intfront; intrear;}Queue;voidInitQueue(Queue......
  • 二叉树的非递归遍历
    //非递归操作#include<stdio.h>#include<stdlib.h>#defineMaxSize200typedefstructTreeNode{intdata;structTreeNode*lchild,*rchild;}TreeNode,*Tree;typedefstruct{Treedata[MaxSize];inttop;}Stack;voidInitStack(S......
  • 二叉树的递归遍历
    #include<stdio.h>#include<stdlib.h>typedefstructTNode{intdata;structTNode*lchild,*rchild;}TreeNode,*Tree;/*在这段代码中,递归函数`CreateTree`在执行`return`语句后,会立即返回到调用它的上一层递归调用。但是,整个递归过程并没有结束,仍然会......