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

二叉搜索树与双向链表

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

思路:采用比较偷懒的方法,前面写过了中序遍历的函数,这里可以直接拿过来用。先中序遍历二叉搜索树得到排序好的切片,再根据这个切片生成双向链表。工作主要是将每个切片元素规定前驱和后继,只需要将第一个的前驱和最后一个的后继设置为nil即可。

package main
import . "nc_tools"

/**
 * 
 * @param pRootOfTree TreeNode类 
 * @return TreeNode类
*/
func Convert(pRootOfTree *TreeNode) *TreeNode {
	// write code here
    //中序遍历
	Inordertraversal := inorderTraversal(pRootOfTree)
    //根据切片生成双向链表
	node := outTreeBySlice(Inordertraversal)
    return node
}

func outTreeBySlice(input []int) *TreeNode {
	if len(input) == 0 {
		return nil
	}
	var res []*TreeNode
    //将每个切片元素从int转为TreeNode
	for i := 0; i < len(input); i++ {
		res = append(res, &TreeNode{Val: input[i]})
	}
    //后继
	for i := 0; i < len(res)-1; i++ {
		if res[i] != nil {
			res[i].Right = res[i+1]
		}
		res[len(res)-1].Right = nil
	}
    //前驱
	for i := len(res)-1; i > 0 ; i-- {
		if res[i] != nil {
			res[i].Left = res[i-1]
		}
		res[0].Left = nil
	}
	return res[0]
}
//中序遍历
func inorderTraversal(root *TreeNode) []int {
	// write code here
	var res []int
	inOrder(root, &res)
	return res
}

func inOrder(root *TreeNode, res *[]int) {
	if root == nil {
		return
	}
	inOrder(root.Left, res)
	*res = append(*res, root.Val)
	inOrder(root.Right, res)
}

全部评论

相关推荐

10-31 14:54
已编辑
门头沟学院 算法工程师
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务