Offre de doigt d'épée (8) ------------- Le nœud suivant dans la traversée de l'ordre des arbres binaires

Utilisez deux méthodes pour y parvenir.

Méthode 1: parcourez l'arborescence binaire en séquence, enregistrez le nœud spécifié et revenez lorsque vous passez au nœud suivant

Complexité temporelle o (n)

 

Deuxième méthode:

1) Lorsque le nœud spécifié a un sous-arbre droit, retourne le premier nœud de traversée d'ordre moyen du sous-arbre droit

2) Lorsque le nœud spécifié n'a pas de sous-arbre droit, s'il s'agit du nœud gauche du nœud parent, le nœud parent est renvoyé

3) Lorsque le nœud spécifié n'a pas de sous-arbre droit et est le nœud droit de son nœud parent, il recherche toujours le nœud parent et revient lorsqu'un certain nœud parent est le nœud gauche de son nœud parent

Complexité temporelle o (logn)

 

Implémentation du code:

class BinNode:
    def __init__(self, val, left=None, right=None, father=None):
        self.val = val
        self.left = left
        self.right = right

        if self.left:
            self.left.father = self
        if self.right:
            self.right.father = self

        self.father = father

    def __str__(self):
        return self.val

def no_traverse_next(target):
    if target.right:
        r = target.right
        while r.left:
            r = r.left
        return r

    f = target
    ff = f.father
    while f and ff:
        if ff.left == f:
            return ff
        else:
            f = ff
            ff = ff.father
    return None


def inorder_traverse_next(root, target):
    prev, node, stack = None, root, []
    while node or stack:
        if node:
            stack.append(node)
            node = node.left
        else:
            n = stack.pop()
            if n == target:
                prev = n
            if prev and n != target:
                return n
            node = n.right
    return None

if __name__ == "__main__":
    i = BinNode('i')
    h = BinNode('h')
    g = BinNode('g')
    f = BinNode('f')
    e = BinNode('e', h, i)
    d = BinNode('d')
    c = BinNode('c', f, g)
    b = BinNode('b', d, e)
    a = BinNode('a', b, c)

    print(inorder_traverse_next(a, i))
    print(inorder_traverse_next(a, b))
    print(inorder_traverse_next(a, g))

    print(no_traverse_next(i))
    print(no_traverse_next(b))
    print(no_traverse_next(g)

 

230 articles originaux publiés · 160 éloges · 820 000 vues

Je suppose que tu aimes

Origine blog.csdn.net/happyAnger6/article/details/104734363
conseillé
Classement