達成するには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)