Is This a Real Tree?
Mathematica, 345 300 bytes

Still quite long, but I guess it's a start...

(s=StringSplit;v=Reverse;#=="|"||#=="\\"||#=="/"&amp;[""&lt;&gt;s@#]&amp;&amp;(g={};i=0;(c={i,++j};d={i,j+1/2};e=2d-c;g=Join[g,Switch[#,"|",{d-&gt;{1,0}+d},"/",{c-&gt;c+1},"\\",{e-&gt;{i+1,j}},"_",{c-&gt;d,d-&gt;e,e-&gt;c},_,{}]])&amp;/@Characters[++i;j=0;#]&amp;/@{##};Sort@VertexOutComponent[Graph@g,g[[1,1]]]==Union@@List@@@g)&amp;@@v@s[#,"
"])&amp;


Here is a slightly ungolfed version:

(
  s = StringSplit;
  v = Reverse;
  # == "|" || # == "\\" || # == "/" &amp;[
      "" &lt;&gt; s@#
      ] &amp;&amp; (
      g = {};
      i = 0;
      (
           c = {i, ++j};
           d = {i, j + 1/2};
           e = 2 d - c;
           g = Join[g, Switch[#,
              "|", {d -&gt; {1, 0} + d},
              "/", {c -&gt; c + 1},
              "\\", {e -&gt; {i + 1, j}},
              "_", {c -&gt; d, d -&gt; e, e -&gt; c},
              _, {}
              ]]
           ) &amp; /@ Characters[
          ++i;
          j = 0;
          #
          ] &amp; /@ {##};
      Sort@VertexOutComponent[Graph@g, g[[1, 1]]] == 
       Union @@ List @@@ g
      ) &amp; @@ v@s[#, "\n"]
) &amp;


This defines an unnamed function which takes the string as input and returns True or False. 

The basic idea is first to check that there's a single root, and then to build an actual (directed) Graph object to check if all vertices can be reached from the root. Here is how we build the graph:

Imagine an integer grid overlaid onto the ASCII art, where integer coordinates correspond to the corners of the character cells. Then on each of the cells there are six relevant points that can be connected. Here is an example, where I've also labelled the points a to f:

     |                 |
     |                 |
---(2,3)---(2.5,3)---(3,2)---
     | d      e      f |
     |                 |
     |                 |
     |                 |
     |                 |
     |                 |
     |                 |
     | a      b      c |
---(2,2)---(2.5,2)---(3,2)---
     |                 |
     |                 |


So we can build a graph whose vertices are these half-integer coordinates, and whose edges are determined by the non-space characters in the input. | connects b to e, / connects a to f and \ connects c to d. Note that these must be directed edges to ensure that we're never moving downwards while traversing the graph later. For _ we can go either way, so in theory we need four edges a -&gt; b, b -&gt; a, b -&gt; c, c -&gt; b. However, we can notice that all that matters is that there's a cycle containing all three vertices, so we can shorten this to three edges: a -&gt; b, b -&gt; c, c -&gt; a.

Building this graph is quite simple in Mathematica, because any object can act as a vertex, so I can actually build a graph whose vertices are the coordinate pairs.

Finally, we check that every vertex can be reached from the root. The root's coordinate is easily found as the very first vertex we added to the graph. Then the shortest way I have found to check if all vertices can be reached is to check if the VertexOutComponent of the root (i.e. the set of all vertices reachable from the root) is identical to the set of all vertices in the graph.