利用R6包,尝试构建了一个二叉树。构建完二叉树之后,想尝试寻找二叉树所有路径 ,并以向量的形式呈现所有二叉树路径。在递归之后,返回的向量值为NULL,但是使用cat ()函数可以正确显示路径。希望大家能帮我看看递归函数什么地方写的不对 。。

library(R6)

Node <- R6Class(
  classname = "Node", 
  public = list(
    var = NULL,
    left = NULL, 
    right = NULL,
    initialize = function(var = NULL, left = NULL, right = NULL){
      self$var <- var
      self$left <- left
      self$right <- right
    }
  )
)


BST <- R6Class(
  classname = "BST",  
  public = list(
    root = NULL,
    insert = function(data){
      if(is.null(self$root)){
        self$root <- Node$new(data)
      }else{
        self$insert_recur(data, self$root)
      }
    },
    insert_recur = function(data, cur_node){
      if(data < cur_node$var){
        if(is.null(cur_node$left)){
          cur_node$left <- Node$new(data)
        }else{
          self$insert_recur(data, cur_node$left)
        }
      }
      else if(data > cur_node$var){
        if(is.null(cur_node$right)){
          cur_node$right <- Node$new(data)
        }else{
          self$insert_recur(data, cur_node$right)
        }
      }else{
        print('value already in tree')
      }
    }
    
  )
)


bst <- BST$new()

bst$insert(3)
bst$insert(6)
bst$insert(1)
bst$insert(2)
bst$insert(5)
bst$insert(7)





print_path <- function(cur_node, str, helper){
  if(is.null(cur_node)){
    return(NULL)
  }
  if(is.null(cur_node$right) & is.null(cur_node$left)){
    helper <- c(helper, paste(str, cur_node$var))
    cat(helper, "\n")
  }else{
    if(!is.null(cur_node$left)){
      print_path(cur_node$left, paste(str, cur_node$var), helper)
    }
    if(!is.null(cur_node$right)){
      print_path(cur_node$right,paste(str, cur_node$var), helper)
    }
  }

  return(helper)
}

x <-  print_path(bst$root, "", c())

仿佛看到了习题课学生的经典错误……你在遍历左右子树时候的print_path的返回值并没有被捕获保存下来(还是说你觉得这个helper是个指针?),那么开始第一的print_path里的helper一直没更新,当然就一直是NULL了,毕竟你最开始给的c()的结果是NULL

一个简单的做法是把遍历左右子树的print_path结果赋值给helper