首页 > 编程语言 >每日算法之二叉树中和为某一值的路径(一)

每日算法之二叉树中和为某一值的路径(一)

时间:2022-11-22 09:13:07浏览次数:38  
标签:TreeNode sum 算法 二叉树 null root 节点 一值

JZ82 二叉树中和为某一值的路径(一)

代码

package esay.JZ82二叉树中和为某一值的路径1;

import java.util.*;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
}


public class Solution {

    /**
     * 描述
     *      给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
     *      1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
     *      2.叶子节点是指没有子节点的节点
     *      3.路径只能从父节点到子节点,不能从子节点到父节点
     *      4.总节点数目为n
     * 思路:
     *      既然是检查从根到叶子有没有一条等于目标值的路径,那肯定需要从根节点遍历到叶子,我们可以在根节点每次往下一层的时候,将sum减去节点值,最后检查是否完整等于0. 而遍历的方法我们可以选取二叉树常用的递归前序遍历,因为每次进入一个子节点,更新sum值以后,相当于对子树查找有没有等于新目标值的路径,因此这就是子问题,递归的三段式为:
     *          终止条件: 每当遇到节点为空,意味着过了叶子节点,返回。每当检查到某个节点没有子节点,它就是叶子节点,此时sum减去叶子节点值刚好为0,说明找到了路径。
     *          返回值: 将子问题中是否有符合新目标值的路径层层往上返回。
     */
    public boolean hasPathSum(TreeNode root, int sum) {
        // write code here
        if (root == null) return false;

        if (root.left == null && root.right == null && sum - root.val == 0) return true;

        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }

    /**
     * 描述
     * 求给定二叉树的最大深度,
     * 深度是指树的根节点到任一叶子节点路径上节点的数量。
     * 最大深度是所有叶子节点的深度的最大值。
     * (注:叶子节点是指没有子节点的节点。)
     * @param root
     * @return
     */
    public int maxDepth (TreeNode root) {
        // write code here
        if (root == null) return 0;

        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }

    public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
        // write code here
        /**
         * 思路:
         *      要将一棵二叉树的节点与另一棵二叉树相加合并,肯定需要遍历两棵二叉树,那我们可以考虑同步遍历两棵二叉树,这样就可以将每次遍历到的值相加在一起。遍历的方式有多种,这里推荐前序递归遍历。
         * 集体做法
         *      step 1:首先判断t1与t2是否为空,若为则用另一个代替,若都为空,返回的值也是空。
         *      step 2:然后依据前序遍历的特点,优先访问根节点,将两个根点的值相加创建到新树中。
         *      step 3:两棵树再依次同步进入左子树和右子树。
         */
        if (t1 == null || t2 == null) return t1 == null ? t2 : t1;

        TreeNode treeNode = new TreeNode();
        treeNode.val = t1.val + t2.val;

        treeNode.left = mergeTrees(t1.left, t2.left);
        treeNode.right = mergeTrees(t1.right, t2.right);

        return treeNode;
    }
}

标签:TreeNode,sum,算法,二叉树,null,root,节点,一值
From: https://www.cnblogs.com/loongnuts/p/16914077.html

相关文章

  • 二叉树
    01.二叉搜索树的最近公共祖先235.二叉搜索树的最近公共祖先当我们从上向下去递归遍历,第一次遇到cur节点是数值在[p,q]区间中,那么cur就是p和q的最近公共祖先;当前节......
  • LC[199] 二叉树的右视图
    [199]二叉树的右视图题目链接:https://leetcode.cn/problems/binary-tree-right-side-view/description/WA一开始的想法是遍历二叉树,只需要右分枝即可。但是如果右边没......
  • 代码随想录算法训练营Day05|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐
    代码随想录算法训练营Day05|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和242.有效的字母异位词题目链接:242.有效的字母异位词题干要求两字......
  • KMP算法——数据结构与算法学习
    KMP算法算法的背景KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法核心思想KMP方法算法就利用之前判断过信息,通过一个next数组,保存模式......
  • 【算法】Java解答有序链表转换二叉搜索树,从中序与后序遍历序列构造二叉树
    有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差......
  • 算法1:Fibonacci数列
    斐波那契数列(Fibonacci) 一、背景介绍斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为......
  • 贪心算法——数据结构与算法学习
    贪心算法基本思想:就是程序在进行运算时,保证每一步达到最优值。不要求总体最优,而是要求每一步都是最优。区间问题给定多个区间,计算让这些区间互不重叠所需要移除区间的最......
  • 动态规划——数据结构与算法学习
    动态规划动态规划的原理其实也是将大问题划分为小问题,从而一步步获取最优解,但是适用于动态规划求解的问题,子问题往往不是独立的,是具有相互关联性。背包问题有一个背包,容......
  • 道长的算法笔记:树结构递归模型
    (一)线性结构的递归模型链表是一种天然带有递归性质的结构,当我们想要处理\(Node_A\)为首的链表,我们尝试处理\(Node_B\)为首的链表,然后再单独处理节点\(A\),类似的,......
  • 代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点
     今日任务●24.两两交换链表中的节点●19.删除链表的倒数第N个节点●面试题02.07.链表相交●142.环形链表II●总结详细布置24.两两交换链表......