Довольно просто:
Код смотрит на root дерева. Если root равен p
или q
, то он возвращает его.
Если его нет в root, он ищет в левом и правом поддеревьях root, повторяя процесс до тех пор, пока root
не станет p
или q
.
Затем последуют 3 последних if
с.
if (left != null && right != null) return root;
Это означает, что он нашел один из узлов в левом поддереве root, а другой - в правом поддереве root, следовательно, root - это LCA.
if(left != null && right == null) return left;
Это означает, что он обнаружил узел в левом поддереве, но нет узла в правом поддереве, тогда левый узел является родителем другого узла, следовательно, LCA.
if(right != null && left == null) return right;
Это означает, что он нашел узел в правом поддереве, но нет узла в левом поддереве, тогда правый узел является родителем другого узла, следовательно, LCA.
В противном случае узлы не находятся в дереве и LCA не существует.