1. 程式人生 > >二叉樹的遍歷及其用途

二叉樹的遍歷及其用途

最近在看《大話資料結構》這本書,看到了很早以前學習的前中後遍歷,想到了面試的時候被問到了這三種遍歷的用途,特地整理一下。

首先就要先說前中後遍歷

這個東西網上百度一大堆,而且都很簡單,其實就是一個口訣。
根左右(前)
左根右(中)
左右根(後)
有沒有發現其實就是‘根’的位置發生了改變,前就是‘根’在前,中在中,後在後。
按照這個口訣遍歷下來就是所謂的前中後遍歷。

下來我們說用途

  1. 輸出某個資料夾下所有檔名稱(可以有子資料夾)—用先序遍歷實現。
  2. 統計某個資料夾的大小(該資料夾下所有檔案的大小)–用後序遍歷實現。
  3. 中綴表示式轉為字尾表示式。

1輸出檔名稱的過程如下:

如果是資料夾,先輸出資料夾名,然後再依次輸出該資料夾下的所有檔案(包括子資料夾),如果有子資料夾,則再進入該子資料夾,輸出該子資料夾下的所有檔名。這是一個典型的先序遍歷過程。

2統計資料夾的大小過程如下:

若要知道某資料夾的大小,必須先知道該資料夾下所有檔案的大小,如果有子資料夾,若要知道該子資料夾大小,必須先知道子資料夾所有檔案的大小。這是一個典型的後序遍歷過程。

3中綴表示式轉為字尾表示式(逆波蘭表示式)。

中綴表示式是一個通用的算術或邏輯公式表示方法。符合人類的邏輯(例:3 + 4)
字尾表示式是一種不需要括號的表達法。符合計算機的邏輯(例:3 4 +)
如果有《大話資料結構》這本書的可以看看P105

程式碼實現

1輸出檔名稱

 public void list(File f){
    list(f, 0);
}
public void list(File f, int depth){
    printName(f, depth);
    if(f.isDirectory()){
        File[] files = f.listFiles();
        for (File file : files) {
            list(file, depth + 1);
        }
    }
}

 private void printName(File f, int depth){
    String name = f.getName();
    for(int i = 0; i < depth; i++)
        System.out.print("    ");
    if(f.isDirectory())
        System.out.println("Dir:" + name);
    else
        System.out.println(f.getName() + ":" + f.length()/1024 + "KB");
}

2統計資料夾的大小

private long totalSize(File f){
    long size = 0;
    if(f.isFile())
    {
        size = f.length();
    }
    else
    {
        File[] files = f.listFiles();
        for (File file : files) {
            size += totalSize(file);
        }
    }
    return size;
}

假設一個表示式,a+b*c+d-e/f,利用將其儲存在二叉樹中,保持中序遍歷得到中綴表示式。

這裡寫圖片描述

其中序遍歷是常見的,後序遍歷是abc*+d+ef/-