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 }