算法:递归

  created  by  鱼鱼 {{tag}}
创建于 2020年05月20日 01:44:30 最后修改于 2020年06月24日 12:30:40

    递归算法主要寻找:

  1. 终止条件:递归的尽头。

  2. 单级递归的行为:在一次递归里要做的事情。

  3. 返回值:每次迭代要return的东西。

例题

求二叉树的深度

class Solution {
    public int maxDepth(TreeNode root) {
        //终止条件:当树为空时结束递归,并返回当前深度0
        if(root == null){
            return 0;
        }
        //root的左、右子树的最大深度
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        //返回的是左右子树的最大深度+1
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

两两交换链表中的节点

例如

给定 1->2->3->4, 你应该返回 2->1->4->3.
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        
        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
      //根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分
        return next;
    }
}

反转链表

    首先,假定方法是已经实现的。

    终止条件为:当当前节点(传了空节点)或下一节点(传了单节点)为空,则无需反转返回当前节点。

    递归行为:假定之后的节点均已实现反转,则需要将已经反转的尾部的next变为当前节点,而当前节点由于是第一个节点,其next为null。此处注意在反转前需要先留存反转后的尾部;

    返回值:返回反转后的头结点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //终止条件
        if(head==null||head.next==null){
            return head;
        }else{
            //保留尾部以便于head节点使用
            ListNode tmp = head.next;
            //剩余节点反转后的头,其实也是最终的头
            ListNode newHead = reverseList(head.next);
            tmp.next = head;
            head.next = null;
            return  newHead;
        }
    }
}


评论区
评论
{{comment.creator}}
{{comment.createTime}} {{comment.index}}楼
评论

算法:递归

算法:递归

    递归算法主要寻找:

  1. 终止条件:递归的尽头。

  2. 单级递归的行为:在一次递归里要做的事情。

  3. 返回值:每次迭代要return的东西。

例题

求二叉树的深度

class Solution {
    public int maxDepth(TreeNode root) {
        //终止条件:当树为空时结束递归,并返回当前深度0
        if(root == null){
            return 0;
        }
        //root的左、右子树的最大深度
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        //返回的是左右子树的最大深度+1
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

两两交换链表中的节点

例如

给定 1->2->3->4, 你应该返回 2->1->4->3.
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        
        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
      //根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分
        return next;
    }
}

反转链表

    首先,假定方法是已经实现的。

    终止条件为:当当前节点(传了空节点)或下一节点(传了单节点)为空,则无需反转返回当前节点。

    递归行为:假定之后的节点均已实现反转,则需要将已经反转的尾部的next变为当前节点,而当前节点由于是第一个节点,其next为null。此处注意在反转前需要先留存反转后的尾部;

    返回值:返回反转后的头结点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //终止条件
        if(head==null||head.next==null){
            return head;
        }else{
            //保留尾部以便于head节点使用
            ListNode tmp = head.next;
            //剩余节点反转后的头,其实也是最终的头
            ListNode newHead = reverseList(head.next);
            tmp.next = head;
            head.next = null;
            return  newHead;
        }
    }
}



算法:递归2020-06-24鱼鱼

{{commentTitle}}

评论   ctrl+Enter 发送评论