как сложность обхода Морриса o (n)?

http://geeksforgeeks.org/?p=6358 Может ли кто-нибудь объяснить, как Morris Traversal имеет временную сложность o(n)? В обходе, всякий раз, когда узел имеет левый дочерний элемент, его копия делается правому дочернему элементу его предшественника. Поэтому в худшем случае предшественник должен быть найден для каждого узла

 while(pre->right != NULL && pre->right != current)
        pre = pre->right;

что собирается увеличить сложность? Я что-то пропустил?

3 ответов


Он не собирается увеличивать сложность, поскольку алгоритм просто перестраивает дерево только в одном направлении(перестройка занимает только O(n), после чего его только O (n) снова печатает их... но они объединили обе функции в одну и ту же функцию и дали специальное имя для algo, что это...


другой способ взглянуть на это-узнать, сколько раз узел дерева будет пройден. Поскольку он постоянен (3 раза для двоичного дерева). Мы смотрим на O (n).


оригинальный документ для Morris traversal является обход бинарных деревьев просто и дешево. Он утверждает, что временная сложность O( n) в разделе введения:

Это также эффективно, принимая время, пропорциональное количеству узлов в дереве и не требующее ни стека времени выполнения, ни битов флага в узлах.

Полная статья должна иметь анализ сложности времени. Но полная бумага не может быть доступна для бесплатный.

Моррис Traversal方法遍历二叉树(非递归,不用栈,О(1)空间) есть ли какой-то анализ. Она представляет собой перевод соответствующей части:

двоичное дерево n-узлов имеет N-1 ребер. В Morris traversal один край посещается не более 2 раз. Один визит для определения местоположения узла. Один визит предназначен для поиска предшественника некоторого узла. В следующем двоичном дереве Красная пунктирная линия предназначена для поиска узла. Черная пунктирная линия для поиска предшественника узел.

enter image description here