package main import . "nc_tools" /* * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ /** * * @param pRootOfTree TreeNode类 * @return TreeNode类 */ func Convert( pRootOfTree *TreeNode ) *TreeNode { // write code here // 特殊情况判断 if pRootOfTree == nil { return nil } // 中序遍历二叉搜索树得到递增序列 // 需要使用 prev 记录前一个遍历的指针 var prev *TreeNode var inorder func(root *TreeNode) inorder = func(root *TreeNode) { if root == nil { return } inorder(root.Left) // 更新当前节点的前驱 root.Left = prev // 如果 prev 不为 nil,将前驱后继指向当前节点 if prev != nil { prev.Right = root } // 更新当前节点为中序遍历的前驱节点 prev = root inorder(root.Right) } inorder(pRootOfTree) // 双向链表的头结点是树中的最左侧节点 for pRootOfTree.Left != nil { pRootOfTree = pRootOfTree.Left } return pRootOfTree }