數據結構-二叉樹(先序、中序、後序遍歷二叉樹的遞歸算法)

思路

二叉樹的遍歷知足遞歸的形式java

二叉樹的遍歷知足遞歸的思路,不管是先序的根左右,中序的左根右,仍是後續的左右跟都是從根結點開始,對每一個結點進行先序/中序/後序的遍歷,每一個結點都是如此,假如是先序根左右的遍歷,咱們先訪問根結點,而後再是左結點,可是左結點沒結束,對左結點又進行一遍根左右的遍歷,那麼對於左結點本身來講,他本身就是根結點了,而後進行根左右遍歷,因而又對總根結點的左結點的左結點再來一次先序遍歷…就這樣一直把整個二叉樹全部結點遍歷完數組

該結點沒有左右結點怎麼辦數據結構

以先序舉例,假如該結點沒有左結點,那就按照根左右的順序,再訪問右結點,要是右結點存在,就繼續先序遍歷,若是右結點不存在,則這層遞歸確定是最裏層的遞歸,該層遞歸到右結點不存在爲結束,而後返回上一層遞歸,並從上層遞歸中左遞歸方法調用的下一行開始,也就是從上層遞歸中的右遞歸正式開始,換句話說就是從該層遞歸對應的雙親結點的右結點處繼續先序遍歷ide

不想將遍歷出的數據直接輸出控制檯怎麼辦post

我看過嚴蔚敏版的 C 語言數據結構,其中是把遍歷的數據直接輸出到控制檯中,如今我有個需求就是想把遞歸遍歷的結構保存到數組中,而且遞歸的返回值就是數組,我該怎麼作呢?
因爲遞歸就是在其方法中調用本身,實現這種[<[<[<[層層嵌套的形式,當第四個[執行完後,就到第三個[,最後到第一個[,第一個最下面返回一個數組便可,實際上每層都會返回數組。this

  1. 若是我把數組放在遞歸方法中能夠嗎?
    若是放在遞歸方法中,數組會被重複初始化,因此我把數組做爲類的成員變量
  2. 下標在遞歸方法中聲明可行嗎?或者做爲遞歸方法的形參呢?
    若是放在遞歸方法中聲名,一樣重複初始化變量。若是做爲形參呢?好像是能夠的,而後仔細一想不行,由於下標是 int 類型的形參,在遍歷的遞歸方法中做爲參數傳過去,遞歸方法中會調用本身這個方法,因此做爲淺拷貝表明的 int 形參在被調用的遞歸方法中無論怎麼變化,跳出這層遞歸返回上一層,該下標又還原了,因此也不行。因此怎麼辦呢,下標 index 直接聲明爲 static 就行,這樣也不用做爲形參去傳了
  3. 其餘注意
    最外層遞歸的 return 返回數組前要記得把 index 重置爲 0,由於我在使用完先序遍歷以後也有可能想再使用中序遍歷或後序遍歷,因此這個 index 要重置爲 0
Java 實現
// 結點
class Node {
    int data;
    Node left = null;
    Node right = null;
}

// 二叉樹
public class BinaryTree {
    // 根結點
    private Node root;
    // 輸入的數組
    private int[] arr_in;
    // 輸出的數組
    private int[] arr_out;
    // 記錄數組下標
    private static int index;
    
    // 初始化
    public BinaryTree(int[] arr) {
        root = new Node();
        this.arr_in = arr;
        arr_out = new int[arr.length];
        index = 0;
    }
    
    // 先序遍歷二叉樹(遞歸)根→左→右
    public int[] preorderTraversalRecursion(Node r) {
        if (r) {
            arr_out[index++] = r.data;
            preorderRecursion(r.left, index);
            preorderRecursion(r.rigth, index);
        }
        if (index == arr_in.length)
            index = 0;
        return arr_out;
    }
    
    // 中序遍歷二叉樹(遞歸)左→根→右
    public int[] inorderTraversalRecursion(Node r) {
        if (r) {
            inorderRecursion(r.left, index);
            arr_out[index++] = r.data;
            inorderRecursion(r.rigth, index);
        }
        if (index == arr_in.length)
            index = 0;
        return arr_out;
    }
    
    // 後序遍歷二叉樹(遞歸)左→右→根
    public int[] postorderTraversalRecursion(Node r) {
        if (r) {
            postorderRecursion(r.left, index);
            postorderRecursion(r.rigth, index);
            arr_out[index++] = r.data;
        }
        if (index == arr_out.length)
            index = 0;
        return arr_out;
    }
}
相關文章
相關標籤/搜索