1. 程式人生 > 其它 >遞迴演算法詳解

遞迴演算法詳解

what:在電腦科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法

when:發現問題可以分解為同類子問題且採用同樣的方式去解決

how:找到遞迴出口和遞迴體

步驟:通過分析題目是否可以分解為若干重複子問題,判斷是否可以採用遞迴演算法進行解決。確定採用遞迴演算法之後,開始找遞迴出口和遞迴體,這是遞迴演算法的核心部分,下面通過兩個題目講一下我的解題步驟。

P1:leetcode226 翻轉二叉樹 簡單題

解答:題目很簡單,翻轉二叉樹,然後檢視輸入輸出,其實就是將每個節點的左右子樹進行了交換。這個時候子問題已經出現了,交換左右子樹,按題目說法就是翻轉左右子樹,可以採用遞迴來做。

接下來需要找到遞迴出口和遞迴體,一般情況下先找遞迴體,因為確定遞迴的時候大概就已經確定了遞迴體,然後就是考慮邊界問題,確定遞迴出口。

回到題目,根據題目的分析,可以確定遞迴體即為交換翻轉當前節點的左右子樹,當遍歷至根節點無節點可翻轉時即退出遞迴,即找到遞迴出口當前節點為null。

接下來程式碼實現:

public class Solution{
   /** 226. 翻轉二叉樹 簡單題
     *
     */
    public TreeNode invertTree(TreeNode root) {
        this.invert(root);
        return root;
    }
    private void invert(TreeNode root){
        if (null
== root) { return; } TreeNode left = root.left; TreeNode right = root.right; root.right = invertTree(left); root.left = invertTree(right); } } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(
int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }

P2:leetcode24,給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。中等題

解答:這個題目也可以採用遞迴來做(但是綜合考慮的話,遞迴其實不是最好的方法,這裡只是用來舉例說明一下遞迴該怎麼去實現)。同樣的找遞迴體遞迴出口,遞迴出口很簡單,連結串列遍歷完,遞迴就結束了,但是需要考慮,子問題是需要兩兩交換,所以遞迴應該滿足兩個條件,當前節點不能為空以及當前節點的下個節點不能為空。而遞迴體,觀察我們需要完成的問題,將相鄰兩個節點交換,那麼我們一直重複做的事情就是在交換兩個相鄰節點以及將交換後的節點正確連結到下個節點,遞迴體也找到了,接下來實現。(遞迴體實現的時候對連結串列的考察,這裡注意好賦值順序一般問題不大,最好的就是畫圖,然後就是遞迴體之間的連結需要考慮到,如果把遞迴體當做一個整體的話,當前塊要連結到下一塊)

接下來程式碼實現:

/**
     * 24. 兩兩交換連結串列中的節點
     */
    public ListNode swapPairs(ListNode head) {
        //1.出口
        if (null == head || null == head.next) {
            return head;
        }
        //2.找到遞迴體
        //兩兩交換
        //下次遞迴頭結點
        ListNode nextHead = head.next.next;
        //相鄰節點交換
        ListNode temp = head.next;
        head.next = nextHead;
        temp.next = head;
        //重置頭結點
        head = temp;
        //設定當前組指向下一個頭結點
        head.next.next = swapPairs(nextHead);
        return head;
    }

最後:遞迴應該算是最簡單的演算法,一般入門就是遞迴,容易想到,實現簡單。但是並不是能夠採用遞迴演算法,遞迴演算法就是最優的選擇,在選擇演算法時候,需要根據應用場景進行選擇,因為遞迴需要遞迴棧儲存現場資訊,帶來額外的空間消耗。工作中最常使用遞迴的應該就是構造部門樹了,資料量小,時間空間都不會佔用太多,遞迴實現很方便。

下集預告:貪心演算法

(可掃描我的微信公眾號二維碼關注我的公眾號,更快獲取更新哦)