首页 > 其他分享 >day18

day18

时间:2023-02-01 23:55:05浏览次数:35  
标签:return int day18 数组 TreeNode null root

1、leetcode513 找树左下角的值

  1. 递归法

    1. 目标:在树的最后一行找到最左边的值

      1. 保证优先左边搜索,【前中后序都可以,因为没有中间节点的处理逻辑】
      2. 然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
    2. 递归三部曲:

      1. 确定递归函数的参数和返回值
        1. 参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。
      2. 确定终止条件
        1. 当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。
      3. 确定单层递归的逻辑
        1. 在找最大深度的时候,递归的过程中依然要使用回溯,
    3. 代码实现

      class Solution {
          private int maxDepth = Integer.MIN_VALUE;//记录最大深度
          private int res = 0;//记录最大深度最左节点的数值
      	
          //找深度最大的叶子节点,确保优先左边遍历
          public void traversal(TreeNode root, int depth){
              if(root.left == null && root.right == null){
                  if(depth > maxDepth){
                  maxDepth = depth;
                  res = root.val;
                  }
                  return;
              }
      
              if(root.left!=null){
                  traversal(root.left, depth+1);
              }
      
              if(root.right!=null){
                  traversal(root.right, depth+1);
              }
      
              return;
      
          }
      
          public int findBottomLeftValue(TreeNode root) {
              traversal(root, 0);
              return res;
          }
      }
      
  2. 迭代法【层序遍历】【找到最后一层的第一个元素】

    class Solution {
        public int findBottomLeftValue(TreeNode root) {
            Queue<TreeNode> que = new LinkedList<TreeNode>();
            int res = 0;
    
            if(root != null){
                que.offer(root);
            }
    
            while(!que.isEmpty()){
                int size = que.size();
    
                for(int i=0; i<size; i++){
                    TreeNode node = que.poll();
                    if(i==0){
                        res = node.val;//记录每层第一个元素,最后值为最后一层的第一个元素值
                    }
                    if(node.left!=null){
                        que.offer(node.left);
                    }
                    if(node.right!=null){
                        que.offer(node.right);
                    }
                }
            }
    
            return res;
        }
    }
    

2、leetcode112 路径总和

  1. 递归法

    1. 代码实现

      class Solution {
          public boolean hasPathSum(TreeNode root, int targetSum) {
              if(root == null){
                  return false;
              }
              targetSum -= root.val;
      
              if(root.left==null && root.right==null){//root为叶子节点
                  return targetSum==0;
              }
      
              if(root.left!=null){//从左子树找到路径
                  if(hasPathSum(root.left, targetSum)){
                      return true;
                  }
              }
      
              if(root.right!=null){//从右子树找到路径
                  if(hasPathSum(root.right, targetSum)){
                      return true;
                  }
              }
      
              return false;
          }   
      }
      

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

  1. 步骤

    1. 第一步:如果后序/中序数组大小为零的话,说明是空节点了。

    2. 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

      • 因为后序是左右中,能够最后一个元素确定root节点
    3. 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

    4. 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

      • 通过root.val切割中序数组
    5. 第五步:切割后序数组,切成后序左数组和后序右数组

      • 通过中序左数组的长度切割后序数据【因此只能先切割中序数组】

      注意:切割标准统一,例如:均为左闭右开形式

    6. 第六步:递归处理左区间和右区间

  2. 代码实现

    class Solution {
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            if(postorder.length == 0){
                return null;
            }
    
            TreeNode root = new TreeNode(postorder[postorder.length-1]);
            if(postorder.length == 1){
                return root;
            }
    
            int index = 0;
            for(index = 0; index<inorder.length; index++){
                if(inorder[index] == root.val){
                    break;
                }
            }
    
            int[] leftInorder = Arrays.copyOfRange(inorder,0,index);
            int[] rightInorder = Arrays.copyOfRange(inorder,index+1,inorder.length);
    
            postorder = Arrays.copyOfRange(postorder,0,postorder.length-1);
            int[] leftPostorder = Arrays.copyOfRange(postorder, 0, leftInorder.length);
            int[] rightPostorder = Arrays.copyOfRange(postorder, leftInorder.length, postorder.length);
    
            root.left = buildTree(leftInorder, leftPostorder);
            root.right = buildTree(rightInorder, rightPostorder);  
    
            return root;
        }
    

4、leetcode105 从前序与中序遍历序列构造二叉树

  1. 思路与上一题一致

  2. 代码实现

    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            if(preorder.length == 0){
                return null;
            }
    
            TreeNode root = new TreeNode(preorder[0]);
            if(preorder.length == 1){
                return root;
            }
    
            int index = 0;
            for(index = 0; index<inorder.length; index++){
                if(inorder[index] == root.val){
                    break;
                }
            }
    
            int[] leftInorder = Arrays.copyOfRange(inorder,0,index);
            int[] rightInorder = Arrays.copyOfRange(inorder,index+1,inorder.length);
    
            preorder = Arrays.copyOfRange(preorder,1,preorder.length);
            int[] leftPretorder = Arrays.copyOfRange(preorder, 0, leftInorder.length);
            int[] rightPretorder = Arrays.copyOfRange(preorder, leftInorder.length, preorder.length);
    
            root.left = buildTree(leftPretorder, leftInorder);
            root.right = buildTree(rightPretorder, rightInorder);  
    
            return root;
        }
    }
    

标签:return,int,day18,数组,TreeNode,null,root
From: https://www.cnblogs.com/hzj-bolg/p/17084536.html

相关文章

  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......
  • Day18 - property和拷贝
    1.装饰器方式的property使用@property对get方法进行装饰get方法在装饰时,不需要再以get_做为前缀在通过@property装饰好Get方法后,可以使用get方法的方法......
  • day18集合
    1.Map集合1.1Map集合概述和特点【理解】Map集合概述interfaceMap<K,V>K:键的类型;V:值的类型Map集合的特点双列集合,一个键对应一个值键不可以重复,值可以重复......
  • 代码随想录算法训练营Day18|513. 找树左下角的值、112. 路径总和、106. 从中序与后序
    代码随想录算法训练营Day18|513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树513.找树左下角的值513.找树左下角的值假设二叉树中至少有一......
  • 指针详解(day18)
    目录指针基础:指针就是地址,在c语言中指针与指针变量大部分情况下不做区分。指针变量在内存中通常以4/8个字节的空间存储,根据系统位数确定。实例intmain(){inta=10;in......
  • 【算法训练营day18】LeetCode513. 找树左下角的值 LeetCode112. 路径总和 LeetCode113
    LeetCode513.找树左下角的值题目链接:513.找树左下角的值初次尝试后序递归法,传递一个容器保存当前节点的高度和当前节点为根的树左下角的值,递归单层逻辑是如果左子树节......
  • Day18.1:构造器详解
    构造器详解构造器也叫构造方法,是创造对象时调用的方法我们建立一个类时,即使我们什么都没开始写,我们可以看到其反编译文件中已经出现了一个方法,这个方法就是构造方法浅谈......
  • Day18.2:对象创建的内存分析图解
    对象创建的内存分析我们从两块最常用的内存空间对对象创建进行内存分析堆内存:存放的是对象的具体信息;在程序之中堆内存空间的开辟是通过new完成的栈内存:存放的是对象的......
  • Day18:值传递和引用传递的内存分析
    值传递和引用传递首先我们先回忆一下数据类型:Java中数据类型分为基本类型和引用类型,其中引用类型涉及到对象的建立。从内存角度分析的话,基本类型存放在栈内存中,而对象......
  • day18-web工程路径
    web工程路径配置tomcat运行快捷键tomcat启动的默认快捷键时shift+f10,可以自定义配置:file-setting-keymap-搜索run,找到右边写有shift+f10的选项,右击选择addkeyboardsh......