JZ26 二叉搜索树与双向链表

二叉搜索树与双向链表


输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

 

思路:

二叉搜索树的中序遍历为 递增序列 。
将 二叉搜索树 转换成一个 “排序的循环双向链表” ,其中包含三个要素:

  • 排序链表: 节点应从小到大排序,因此应使用 中序遍历 “从小到大”访问树的节点。
  • 双向链表: 在构建相邻节点的引用关系时,设前驱节点 pre 和当前节点 cur ,不仅应构建 pre.right = cur ,也应构建 cur.left = pre 。
  • 循环链表: 设链表头节点 head 和尾节点 tail ,则应构建 head.left = tail 和 tail.right = head 。
var  head, pre *TreeNode = nil, nil // //返回的第一个指针,即为最小值,先定为NULL

func Convert(pRootOfTree *TreeNode) *TreeNode {
	// write code here
	if pRootOfTree == nil {//中序递归,叶子为空则返回
		return nil
	}

	Convert(pRootOfTree.Left)//首先递归到最左最小值  
	if pre == nil {//找到最小值,初始化head与pre
        head, pre = pRootOfTree, pRootOfTree
    } else {//当前节点与上一节点建立连接,将pre设置为当前值
        pre.Right = pRootOfTree
        pRootOfTree.Left = pre
        pre = pRootOfTree
    }

    Convert(pRootOfTree.Right)
    return head
}

  

posted @ 2021-04-09 22:38  zqlucky  阅读(53)  评论(0编辑  收藏  举报