概述

樹可以有兩種定義方式,遞歸和非遞歸。

非遞歸定義

樹有結點集合和連接每對結點的有向邊結合 組成。

樹的遞歸定義

要麼樹爲空,要麼由根和零個或者多個非空子樹組成,每棵樹的根都被來自於根的邊連接。

樹的性質

一個特殊的結點作爲根,根節點沒有父節點,沒有子節點的是葉子結點。

除了根之外,每個結點都被來自另一結點的邊直接連接,被指向的是孩子,另一端是父親。

從根節點帶每個結點的遍歷路徑只有一條,遍歷所需走過的邊數即爲路徑長度。

樹中某個結點的深度是指由根節點到該節點的路徑長度;樹中結點的高度是指該節點到最深葉子結點的路徑長度。

結點的大小是指該節點所擁有的子孫數(包括結點本省);根節點的大小即爲樹的大小。

樹的遍歷

前序遍歷:先處理自身,然後處理孩子結點(自身->左子結點->右子節點)

後序遍歷:先處理孩子結點,然後處理自身(左子結點->右子節點->自身)

中序遍歷:先處理左子結點,然後是自身,最後是右子節點(左子結點->自身->右子節點)

遍歷示例

樹可以遞歸的進行遍歷:
public void preOrder(){
System.out.println(ele);
if(left!=null){
left.preOrder();
}
if(right != null){
right.preOrder();
}
}
public void postOrder(){
if(left!=null){
left.postOrder();
}
if(right != null){
right.postOrder();
}
System.out.println(ele);
}
public void inOrder(){
if(left!=null){
left.inOrder();
}
System.out.println(ele);
if(right != null){
right.inOrder();
}
}

也可以使用棧來實現非遞歸的遍歷,以後序遍歷爲例:
在遍歷過程中,每個節點都會三次放入棧中。第三次彈出是表示該節點爲當前要訪問的結點。
這裏寫圖片描述
棧中包含已經遍歷但是未完成的結點,當將結點壓入棧中,計數器的值爲1、2、3時分別表示如下情況:我們要處理結點的左子樹、要處理的右子樹和自身

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章