本例中樹結構、節點權如下圖所示
順序儲存是指將二叉樹儲存在一個數組中,透過儲存元素的下標反映元素之間的父子關係。任何一個二叉樹都可以轉換為陣列,同理,任何一個數組都可以轉換為二叉樹。
順序儲存的二叉樹通常只考慮完全二叉樹(滿二叉樹其實也是一個完全二叉樹)
第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
執行結果
貼上兩個類的完整程式碼
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與資料結構
原創
內容持續更新中~
歡迎您點選
關注
或點選頭像瀏覽更多
移動端開發技術乾貨
!