吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1974|回复: 3
收起左侧

[Java 转载] 递归解题核心思想

[复制链接]
逸帅 发表于 2021-4-21 23:50

递归解题核心思想

1、递归要考虑的三个问题:

  • 递归应该在什么时候结束?
  • 我应该返回什么信息给上层?
  • 在这一次的递归中,要完成什么任务?

递归每一层的功能都是一样的,所以只要解决了这三个问题,递归的问题就解决了

2、举例说明:

2.1、二叉树的最大深度

1、什么时候结束递归?

​     当遍历到树的左右节点都为空的时候,递归就结束了!

2、返回给上层的是什么?

​     因为是对树深度的遍历,所以返回给上层的,自然是这颗子树的深度

3、本次递归中,要完成什么任务?

​     每一次的递归,都是在获取树的深度,可能左右子树都存在,那么自然要返回最高的那颗树的值,同时,要加上1,因为本身的这棵树,也属于一层,当遍历到自身为null的时候,就返回0(不用+1)

4、代码如下:

public int maxDepth(TreeNode root) {
        if (root == null){
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return left > right ? left + 1 : right + 1;
    }

2.2、两两交换链表中的节点

问题描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

1、什么时候结束递归?

​     当已经到了最后的元素,不能再交换了,结束递归

2、返回给上层的是什么?

​     交换后的链表,把两个链表进行交换后,返回给上一层

3、本次递归中,要完成什么任务?

​     递归值考虑一层,也就意味着,我们眼中的一条链表,分成了三个部分

​     head-->head.next-->已经处理好的链表部分,我们要做的,自然就是把head和head.next进行交换

4、代码实现

                if (head == null || head.next == null) {
            return head;
        }
        /**
         * 用temp做中间临时变量
         */
        ListNode temp = head.next;
        //把排序好的链表,挂到head节点的next上面
        head.next = swapPairs(temp.next);
        //把head,挂到临时变量的next上面
        temp.next = head;
        return temp;

2.3、判断二叉树是否高度平衡

1、什么时候结束递归?

​     当左子树或右子树不为平衡二叉树时,或遍历完所有节点

2、返回给上层的是什么?

​     本层的子树,是否是一颗平衡二叉树

3、本次递归中,要完成什么任务?

​     计算本层的高度差,并判断本层的左子树和右子树是否是一个平衡二叉树

4、代码实现

 /**
     * 遍历左右子树的同时,计算左右子树的是否是个平衡二叉树
     * @Param root
     * @return
     */
    public boolean isBalanced(TreeNode root) {
        if (root == null){
            return true;
        }else {
            //返回当前树的高度差是否小于等于1
           return (Math.abs(maxHeight(root.left) - maxHeight(root.right)) <= 1)
                   //判断左子树和右子树,是否都是平衡的二叉树
                   && isBalanced(root.left) && isBalanced(root.right) ;
        }
    }
    //求树深度
    int maxHeight(TreeNode root){
        return root == null ? 0 : Math.max(maxHeight(root.left),maxHeight(root.right)) + 1;
    }

本文参考lyl大佬的博客,发表自己的意见,感谢lyl大佬提供的思路!

免费评分

参与人数 5吾爱币 +8 热心值 +5 收起 理由
san4san + 1 + 1 我很赞同!
zsr849408332 + 1 + 1 谢谢@Thanks!
sdaza + 1 热心回复!
为之奈何? + 1 + 1 我很赞同!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 逸帅 发表于 2021-4-22 09:05
yamika 发表于 2021-4-22 08:33
感觉递归最重要的还是找到终止条件,很多问题执行过程比较容易分析,递归终止条件需要推导一下

三个问题都重要哦,就像第三个例子,树的深度和是否平衡都要考虑进去,在返回信息的时候就要考虑这些。只考虑终止条件的话,不是很好变通
Lokeyw 发表于 2021-4-22 00:04
本帖最后由 Lokeyw 于 2021-4-22 00:07 编辑

感觉概念差不多会了,递归汉诺塔,我还是不会。就是用递归思想思考,感觉好难&#129327;
StuFish 发表于 2021-4-22 00:23
Lokeyw 发表于 2021-4-22 00:04
感觉概念差不多会了,递归汉诺塔,我还是不会。就是用递归思想思考,感觉好难&#129327;

同没搞清楚汉诺塔递归
yamika 发表于 2021-4-22 08:33
感觉递归最重要的还是找到终止条件,很多问题执行过程比较容易分析,递归终止条件需要推导一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表