add TreeNode.visit()