首页 > 其他分享 >DAY14 二叉树part04

DAY14 二叉树part04

时间:2024-09-12 22:46:02浏览次数:1  
标签:node res List part04 DAY14 二叉树 path null root

找树左下角的值

513. 找树左下角的值

  • 迭代法层序遍历
 class Solution {
        public List<List<Integer>> reList=new ArrayList<>();
        public int findBottomLeftValue(TreeNode root) {

            check(root);
           int index=reList.size()-1;
           return reList.get(index).get(0);
        }

        public  void check(TreeNode node)
        {

            if(node==null)
            {
                return ;
            }
            Queue<TreeNode> qe=new LinkedList<>();
            qe.offer(node);
            while(!qe.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<>();
                int lens=qe.size();
                while(lens>0)
                {
                    TreeNode tmp=qe.poll();
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        qe.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        qe.offer(tmp.right);
                    }
                    lens--;
                }
                reList.add(itemlist);

            }

        }

    }

路径总和

112. 路径总和

  • 方法一
class Solution {
        public boolean hasPathSum(TreeNode root, int targetSum) {
            if(root==null) return false;

            if(root.left==null&&root.right==null)
            {
                return targetSum==root.val;
            }
            int newTargetSum=targetSum-root.val;
           return hasPathSum(root.left, newTargetSum) || hasPathSum(root.right, newTargetSum);
           
        }
    }
  • 方法二:求所有路径并判断每条路径的和是否存在等于目标和
 class Solution {
        public  List<List<Integer>> res=new ArrayList<>();
        public boolean hasPathSum(TreeNode root, int targetSum) {
            if(root==null) return false;
            List<Integer> path=new ArrayList<>();
            traversal(root,path,res);
            for(int i=0;i<res.size();i++)
            {
                int Sum=0;
                for(int j=0;j<res.get(i).size();j++)
                {
                    Sum+=res.get(i).get(j);
                }
                if(Sum==targetSum) return true;
            }
            return false;
        }
        private void traversal(TreeNode node,List<Integer> path,List<List<Integer>> res)
        {
            //if(node==null) return;
            path.add(node.val);

            if(node.left==null&& node.right==null)//叶子节点
            {

                    res.add(new ArrayList<>(path));
                      path.remove(path.size() - 1); // 回溯:移除当前节点,恢复路径到上一个状态
                return ;
            }
            if(node.left!=null)
            {
                traversal( node.left, path,res);
               
            }

            if(node.right!=null)
            {
                traversal( node.right, path,res);
              

            }
            path.remove(path.size()-1);
        }
    }

路径总和II

 class Solution {
        public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
            List<List<Integer>> res = new ArrayList<>(); // 用于存储所有满足条件的路径
            List<Integer> path = new ArrayList<>(); 

           
            findPaths(root, targetSum, path, res);

            return res;
        }

        private void findPaths(TreeNode node, int targetSum, List<Integer> path, List<List<Integer>> res) {
            if (node == null) return; // 如果当前节点为空,直接返回

            // 添加当前节点到路径中
            path.add(node.val);

            // 如果当前节点是叶子节点,检查路径和是否等于目标和
            if (node.left == null && node.right == null && targetSum == node.val) {
                res.add(new ArrayList<>(path)); // 保存路径的副本
            } else {
                // 递归检查左子树和右子树
                findPaths(node.left, targetSum - node.val, path, res);
                findPaths(node.right, targetSum - node.val, path, res);
            }

            // 回溯:移除当前节点,恢复路径到上一个状态
            path.remove(path.size() - 1);
        }
    }
 class Solution {
        public  List<List<Integer>> res=new ArrayList<>();
        public List<List<Integer>> pathSum(TreeNode root, int targetSum)  {
            if(root==null)
                return null;
            List<Integer> path=new ArrayList<>();

            traversal(root,path,res);

               // 只保留满足条件的路径
        List<List<Integer>> validPaths = new ArrayList<>();
            for(int i=0;i<res.size();i++)
            {
                int Sum=0;
                for(int j=0;j<res.get(i).size();j++)
                {
                    Sum+=res.get(i).get(j);
                }
             
                   if(Sum==targetSum)
                   {
                    validPaths.add(res.get(i));
                   }
    

                
            }
            return validPaths;
        }
        private void traversal(TreeNode node,List<Integer> path,List<List<Integer>> res)
        {
           // if(node==null) return;
            path.add(node.val);

            if(node.left==null&& node.right==null)//叶子节点
            {

                res.add(new ArrayList<>(path));
                path.remove(path.size() - 1); // 回溯:移除当前节点,恢复路径到上一个状态
                return ;
            }
            if(node.left!=null)
            {
                traversal( node.left, path,res);

            }

            if(node.right!=null)
            {
                traversal( node.right, path,res);


            }
            path.remove(path.size()-1);
        }
    }

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


标签:node,res,List,part04,DAY14,二叉树,path,null,root
From: https://www.cnblogs.com/FreeDrama/p/18411281

相关文章

  • 代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍
    513.找树左下角的值题目链接:513.找树左下角的值文档讲解︰代码随想录(programmercarl.com)视频讲解︰找树左下角的值日期:2024-09-12想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。Java代码如下://迭代classSolut......
  • 题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++
    题目传送门:105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/每次在中序遍历序列片段中找到前序遍历序列队首,这是该层的根节点该位置左侧是左子树,右侧是右子树再......
  • 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)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树......
  • 【洛谷 P5076】【深基16.例7】普通二叉树(简化版)题解(多重集合+lower_bound+upper_bound
    【深基16.例7】普通二叉树(简化版)题目描述您需要写一种数据结构,来维护一些数(都是以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数不超过:查询数的排名(排名定义为比当前数小的数的个数。若有多个相同的数,应输出最小的排名)。查询排名为的数。求的前驱(......