需要思考的问题
- 如何从startValue遍历到destValue?
- 如何实现L和R的切换?
如何解决上述问题
对于问题一:
通常来说,大家直观的感受是先在树中找到startValue所在的节点,然后再通过该节点去遍历到destValue所在节点,但是这种遍历方式很难实现。
所以我们将startVaule到destValue的路径分成两部分,分别是从根节点到startValue和从根节点到destValue,最后将这两部分的路径拼接在一起形成一个完成的路径。
对于问题二:
由于使用递归遍历的方式遍历树结构,所以可以采用回溯算法的方式来决定完成L和R的切换。
示例代码
func getDirections(root *TreeNode, startValue int, destValue int) string {
if root == nil {
return ""
}
path := []byte{}
var orderFunc func(node *TreeNode, target int) bool
orderFunc = func(node *TreeNode, target int) bool {
if node == nil {
return false
}
if node.Val == target {
return true
}
path = append(path, 'L')
if orderFunc(node.Left, target) {
return true
}
path[len(path)-1] = 'R'
if orderFunc(node.Right, target) {
return true
}
path = path[:len(path)-1]
return false
}
var startPath []byte
orderFunc(root, startValue)
startPath = path
path = nil
var destPath []byte
orderFunc(root, destValue)
destPath = path
for len(startPath) > 0 && len(destPath) > 0 && startPath[0] == destPath[0] {
startPath = startPath[1:]
destPath = destPath[1:]
}
return strings.Repeat("U", len(startPath)) + string(destPath)
}