题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

var nodeList []*TreeNode

func Convert(pRootOfTree *TreeNode) *TreeNode {
	// 如果二叉搜索树是一棵空树直接返回空
	if pRootOfTree == nil {
		return nil
	}
	nodeList = []*TreeNode{}
	// 调用遍历二叉树函数
	inOrder(pRootOfTree)

	// 选择 nodeList 的第一个结点作为双向链表的头结点
	var head *TreeNode
	head = nodeList[0]
	// 将头结点的上一个结点置为空
	head.Left = nil
	// 定义变量 preNode 用于指向当前被遍历节点的上一个结点,初始化的时候指向头结点
	preNode := head

	// 遍历 nodeList
	for i := 1; i < len(nodeList); i++ {
		// 将 preNode 的后继结点指向当前被遍历的结点
		preNode.Right = nodeList[i]
		// 将当前被遍历结点的上一个结点指向 preNode
		nodeList[i].Left = preNode
		// preNode 向右移动
		preNode = preNode.Right
	}
	// 返回双向链表
	return head
}

// 定义递归函数中序遍历二叉搜索树,并将遍历的结果加入到一个序列中
func inOrder(curNode *TreeNode) {
	// 递归结束的条件:当前被遍历的结点为空
	if curNode == nil {
		return
	}

	// 递归处理当前结点的左子树
	inOrder(curNode.Left)
	// 处理中结点
	nodeList = append(nodeList, curNode)
	// 递归处理当前结点的右子树
	inOrder(curNode.Right)
}
全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务