二叉搜索樹與雙向鏈表
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
二叉搜索樹的中序遍歷爲 遞增序列 。
將 二叉搜索樹 轉換成一個 “排序的循環雙向鏈表” ,其中包含三個要素:
- 排序鏈表: 節點應從小到大排序,因此應使用 中序遍歷 “從小到大”訪問樹的節點。
- 雙向鏈表: 在構建相鄰節點的引用關係時,設前驅節點 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 }