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
}