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
}
原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639139.html