二叉树--递归和回溯

首先我们需要了解递归和回溯是什么意思

  1. 递归:

    • 定义: 递归是一种在算法或函数中调用自身的过程。递归通常用于解决可以被拆分成相似子问题的问题。在递归算法中,每一次递归调用都是对较小子问题的求解,直到达到某个终止条件,然后逐层返回结果。
    • 特点: 递归能够简化问题的表达,使得算法更加清晰和易于理解。在编写递归算法时,需要确保递归能够收敛到一个终止条件,否则可能导致无限递归。

    举例:计算阶乘是一个典型的递归问题。阶乘的递归定义为 n! = n * (n-1)!,并在 n = 0 时有基本情况 0! = 1

  2. 回溯:

    • 定义: 回溯是一种通过不断试探和撤销先前的选择来搜索解空间的算法。在解决问题时,回溯算法会尝试一条路径,如果发现这条路径不符合要求,就返回上一步(回溯),并尝试其他可能的路径,直到找到解或遍历完所有可能的选择。
    • 特点: 回溯通常用于解决那些可能有多个解,且需要尝试多个组合的问题。它是一种深度优先搜索的策略。

    举例:在解决八皇后问题时,回溯算法可以用于找到一个合法的棋盘布局,其中八个皇后互不攻击。

简单来说:

递归:就是从外层向底层走的过程

回溯:就是从底层向外走的过程

接下来通过两个例题来讲解递归和回溯这个知识。 

二叉树的最近公共祖先


236. 二叉树的最近公共祖先

先看这个题目,如果我们需要找到两个节点的最小公共父节点,肯定是要从叶子节点(最底层)开始来进行的,从底层开始向外走(回溯),看看左右子树分别是否存在p,q子节点。如果满足了左右子树中分别有p或q子节点,那这个节点就是最近的公共祖先。

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q)  
            return root;
        TreeNode left = lowestCommonAncestor(root.left,p,q);//开始向下递归,到最后条件不符合的时候,开始回溯。
        TreeNode right = lowestCommonAncestor(root.right,p,q);//这里也是一样的
//到最后回溯的时候,其实是从最底层向外层慢慢走的
        if(left == null)    return right;
        if(right == null)   return left;
        return root;
    }
}

 

二叉树中最大路径和

124. 二叉树中的最大路径和

这个题目也是一样用递归,回溯进行的。先递归到最底层,然后向外走(回溯)。

题目思路:

  1. 定义递归函数: 设计一个递归函数,该函数的作用是计算包含当前节点的最大路径和。这个函数需要返回两个值:

    • 以当前节点为根的子树中的最大路径和。
    • 以当前节点为根的子树中,从当前节点出发向下走到任意节点的最大路径和。
  2. 递归计算: 对于每个节点,递归地计算其左右子树的最大路径和。然后,考虑三种情况:

    • 以当前节点为根的子树中的最大路径和(只包含当前节点)。
    • 左子树中从根节点向下走到任意节点的最大路径和。
    • 右子树中从根节点向下走到任意节点的最大路径和。
  3. 更新全局最大值: 在递归的过程中,维护一个全局变量,记录当前已经找到的最大路径和。

class Solution {
    int res = Integer.MIN_VALUE;
    int maxPath(TreeNode root){
        if(root == null)
            return 0;
        int left = Math.max(maxPath(root.left),0);
        int right = Math.max(maxPath(root.right),0);

        int priceNewNode = root.val+left+right;

        res = Math.max(res,price);

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

    public int maxPathSum(TreeNode root) {
        maxPath(root);
        return res;
    }
}

 

根据这两个题目,我们已经可以了解了,什么是递归和回溯,怎么来实现了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值