JZ26 二叉搜索樹與雙向鏈表

二叉搜索樹與雙向鏈表


輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

 

思路:

二叉搜索樹的中序遍歷爲 遞增序列 。
將 二叉搜索樹 轉換成一個 “排序的循環雙向鏈表” ,其中包含三個要素:

  • 排序鏈表: 節點應從小到大排序,因此應使用 中序遍歷 “從小到大”訪問樹的節點。
  • 雙向鏈表: 在構建相鄰節點的引用關係時,設前驅節點 pre 和當前節點 cur ,不僅應構建 pre.right = cur ,也應構建 cur.left = pre 。
  • 循環鏈表: 設鏈表頭節點 head 和尾節點 tail ,則應構建 head.left = tail 和 tail.right = head 。
func Convert( pRootOfTree *TreeNode ) *TreeNode {
    if pRootOfTree == nil {
        return nil
    }
    var stack []*TreeNode
    var pre *TreeNode = nil
    var root *TreeNode = pre
    isFirst := true
    for len(stack) != 0 || pRootOfTree != nil {
        for pRootOfTree != nil {
            stack = append(stack, pRootOfTree)
            pRootOfTree = pRootOfTree.Left
        }
        sz := len(stack)
        if sz != 0 {
            pRootOfTree = stack[sz-1]
            stack = stack[:sz-1]
            if isFirst {
                isFirst = false
                pre = pRootOfTree
                root = pre
            } else {
                pre.Right = pRootOfTree
                pRootOfTree.Left = pre
                pre = pRootOfTree
            }
            pRootOfTree = pRootOfTree.Right
        }
    }
    return root
}

 

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