ソードフィンガーオファー(8)-------------バイナリツリー順序トラバーサルの次のノード

達成するには2つの方法を使用します。

方法1:バイナリツリーを順番にトラバースし、指定されたノードを記録し、次のノードにトラバースするときに戻る

時間の複雑さo(n)

 

方法2:

1)指定されたノードに正しいサブツリーがある場合、右側のサブツリーの最初の中位トラバーサルノードを返します

2)指定されたノードに右サブツリーがない場合、それが親ノードの左ノードである場合、親ノードが返されます

3)指定されたノードが正しいサブツリーを持たず、その親ノードの右ノードである場合、常に親ノードを検索し、特定の親ノードがその親ノードの左ノードである場合に戻ります

時間の複雑さo(logn)

 

コードの実装:

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元の記事 ウォンの賞賛160 ビュー820 000 +

おすすめ

転載: blog.csdn.net/happyAnger6/article/details/104734363
おすすめ