二叉樹的遍歷及其用途
阿新 • • 發佈:2018-12-25
最近在看《大話資料結構》這本書,看到了很早以前學習的前中後遍歷,想到了面試的時候被問到了這三種遍歷的用途,特地整理一下。
首先就要先說前中後遍歷
這個東西網上百度一大堆,而且都很簡單,其實就是一個口訣。
根左右(前)
左根右(中)
左右根(後)
有沒有發現其實就是‘根’的位置發生了改變,前就是‘根’在前,中在中,後在後。
按照這個口訣遍歷下來就是所謂的前中後遍歷。
下來我們說用途
- 輸出某個資料夾下所有檔名稱(可以有子資料夾)—用先序遍歷實現。
- 統計某個資料夾的大小(該資料夾下所有檔案的大小)–用後序遍歷實現。
- 中綴表示式轉為字尾表示式。
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/-