1. 程式人生 > >陣列表示的二叉樹

陣列表示的二叉樹

面試某廠的時候面試官問了二叉樹最長路徑的演算法題,給定一個數組找出最長路徑的值,第一反應就是動態規劃,結果手寫程式碼的時候懵逼想不起怎麼通過子節點推算父節點的下標,特此記錄警世自己。

fun main(args: Array<String>) {
    val t = Tree()
    t.printParentNode(1)
    t.printParentNode(2)
    t.printParentNode(3)
    t.printParentNode(4)
    t.printParentNode(5)
    t.printParentNode(6)
    t.printParentNode(7)
    t.printParentNode(8)
    t.printParentNode(9)
}

class Tree {

    private val data : IntArray = intArrayOf(9,6,4,8,3,7,2,10,25,7)

    /**                                         下標                第n個節點
     *                              9            0                      1
     *                           /    \
     *                          6      4        1 2        1層         2 3
     *                         / \     /\
     *                        8   3   7  2     3 4 5 6     2層        4 5 6 7
     *                       / \  /
     *                      10 25 7            7 8 9       3層        8 9 10
     *
     *                     某個陣列中某個index i,對應的父節點下標是:(i+1)/2 - 1
     *                     如(3+1)/2-1 = 1   (4+1)/2-1 = 1
     *                     (8+1)/2-1 = 3    (9+1)/2-1 = 4
     *
     */



    fun printParentNode(i : Int): Unit {
        println("index $i 值是${data[i]} 對應的父節點是 ${data[(i+1)/2-1]}")
    }

}

輸出:

index 1 值是6 對應的父節點是 9
index 2 值是4 對應的父節點是 9
index 3 值是8 對應的父節點是 6
index 4 值是3 對應的父節點是 6
index 5 值是7 對應的父節點是 4
index 6 值是2 對應的父節點是 4
index 7 值是10 對應的父節點是 8
index 8 值是25 對應的父節點是 8
index 9 值是7 對應的父節點是 3

面試題的程式碼解法如:

fun maxLen(): Int {
        val tmp = intArrayOf(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
        data.forEachIndexed {
            index, i ->
            tmp[index] = if (index == 0) 0 else {
                val parentIndex = (index+1)/2-1
                if (tmp[parentIndex] + i > tmp[index-1]) tmp[parentIndex] + i else tmp[index-1]
            }
        }
        println("最長路徑:")
        tmp.forEach {
            i: Int -> print("$i,")
        }
        return tmp[tmp.lastIndex]
    }

輸出:

最長路徑:
0,6,6,14,14,14,14,24,39,39,