Kotlin遇見資料結構丨說說順序儲存的二叉樹如何建立遍歷

本例中樹結構、節點權如下圖所示

Kotlin遇見資料結構丨說說順序儲存的二叉樹如何建立遍歷

順序儲存是指將二叉樹儲存在一個數組中,透過儲存元素的下標反映元素之間的父子關係。任何一個二叉樹都可以轉換為陣列,同理,任何一個數組都可以轉換為二叉樹。

順序儲存的二叉樹通常只考慮完全二叉樹(滿二叉樹其實也是一個完全二叉樹)

第N個元素的左子節點為:2*N+1

第N個元素的右子節點為:2*N+1

第N個元素的父節點為:(N-1)/ 2(整數相除得整數)

1. Kotlin 中順序儲存的二叉樹如何建立

1.1 新建順序儲存的二叉樹 Bean:ArrayBianryTree.kt

/** * @des 順序儲存二叉樹Bean * @author liyongli 20190220 * * @param data 準備遍歷的陣列,不可為null * */data class ArrayBianryTree(var data:IntArray) {}

注意:在 Kotlin 中使用 data class 宣告類時,可以直接建立一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO,大大減少了樣板程式碼數量,這是 Kotlin 的一大特色!

1.2 新建宣告樹物件並賦值的 Activity: ArrayBinaryTreeActivity.kt

// 定義陣列物件var data:IntArray? = intArrayOf(1,2,3,4,5,6,7)// 初始化順序儲存的二叉樹物件var arrayBinary:ArrayBianryTree = ArrayBianryTree(data!!)

注意:變數 data 使用 “?” 修飾表示變數值可為空。“ArrayBianryTree(data!!)” 表示當變數 data 為空時丟擲NPE異常

2. Kotlin 中順序儲存的二叉樹如何遍歷

2.1 Bean 中建立前序遍歷方法: frontShow(index:Int)

/** * 順序儲存的二叉樹前序遍歷 * * @param index 遍歷的起點,不可為null * */ fun frontShow(index:Int) { // 注意,此處不做非空判斷是因為:此方法對傳參的要求未加“?”號,即為非空引數! if(data。size == 0 ){ return } // 輸出當前節點值 ArrayBinaryTreeActivity。frontResult。append(“ ” + data[index] + “ , ”) // 遍歷左子節點值(第N個元素的左子節點為:2*N+1) if(2*index+1 < data。size){ frontShow(2*index+1) } // 遍歷右子節點值(第N個元素的右子節點為:2*N+1) if(2*index+2 < data。size){ frontShow(2*index+2) } }

2.2 Activity 中呼叫遍歷方法 frontShow() 並更新UI

// 從0開始遍歷二叉樹arrayBinary。frontShow(0)// 更新UIfrontTv。text = frontResult

執行結果

Kotlin遇見資料結構丨說說順序儲存的二叉樹如何建立遍歷

貼上兩個類的完整程式碼

ArrayBianryTree.kt

/** * @des 順序儲存二叉樹Bean * @author liyongli 20190220 * * @param data 準備遍歷的陣列,不可為null * */data class ArrayBianryTree(var data:IntArray) { /** * 順序儲存的二叉樹前序遍歷 * * @param index 遍歷的起點,不可為null * */ fun frontShow(index:Int) { // 注意,此處不做非空判斷是因為:此方法對傳參的要求未加“?”號,即為非空引數! if(data。size == 0 ){ return } // 輸出當前節點值 ArrayBinaryTreeActivity。frontResult。append(“ ” + data[index] + “ , ”) // 遍歷左子節點值 if(2*index+1 < data。size){ frontShow(2*index+1) } // 遍歷右子節點值 if(2*index+2 < data。size){ frontShow(2*index+2) } }}

ArrayBinaryTreeActivity.kt

/** * @des 建立順序儲存的二叉樹並遍歷 * @author liyongli 20190220 * */class ArrayBinaryTreeActivity : AppCompatActivity() { companion object { // 遍歷結果 var frontResult:StringBuffer = StringBuffer() } override fun onCreate(savedInstanceState: Bundle?) { super。onCreate(savedInstanceState) setContentView(R。layout。activity_binary_tree) // 定義陣列物件 var data:IntArray? = intArrayOf(1,2,3,4,5,6,7) // 初始化順序儲存的二叉樹物件 var arrayBinary:ArrayBianryTree = ArrayBianryTree(data!!) // 從0開始遍歷二叉樹 arrayBinary。frontShow(0) // 更新UI frontTv。text = frontResult }}

本篇到此完結,更多Kotlin與資料結構

原創

內容持續更新中~

歡迎您點選

關注

或點選頭像瀏覽更多

移動端開發技術乾貨

Kotlin遇見資料結構丨說說順序儲存的二叉樹如何建立遍歷