Leetcode 2096. 从二叉树一个节点到另一个节点每一步的方向

142 阅读1分钟

题目连接

需要思考的问题

  1. 如何从startValue遍历到destValue?
  2. 如何实现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)
}