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

二叉搜索树与双向链表

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)
}
全部评论

相关推荐

12-15 19:41
已编辑
广东工业大学 前端工程师
smile丶snow:尽量保证的一张a4纸吧。为什么工作经历只有公司?如果项目经历是工作里面的,应该写到工作经历里的吧。没有写项目职责,项目全是一个人写的吗?标题大小也好怪。两个项目的分割看不出来是,它和那些项目成功字体是一样大的
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务