二叉树后继节点

二叉树后继节点,中序遍历的后一个节点
(1)有右子树,右子树的最左节点是后继
(2)无右子树,并且是父节点的左孩子,父节点为后继
(3)无右子树,并且是父节点的右孩子,查该节点是哪个节点左子树的最后节点
(一直往上找,找到一个节点是父节点的左孩子,则该父节点为后继节点)

class Node():
    def __init__(self,item):
        self.elem=item
        self.lchild=None
        self.rchild=None
        self.parent=None
def getSuccessorNode(node):
    if node == None:
        return node
    if node.rchild != None:   #没有右子树
        return getleftMost(node.rchild)
    else:                             #有右子树
        parent = node.parent
        while parent != None and parent.lchild != node:  #(3)
            node = parent
            parent = node.parent
        return parent
def getleftMost( node):  # 找最左节点
    if node == None:
        return node
    while node.lchild != None:
        node = node.lchild
    return node
    
head=Node(6)
head.parent=None
head.lchild=Node(3)
head.lchild.parent=head
head.lchild.lchild =Node(1)
head.lchild.lchild.parent = head.lchild
head.lchild.lchild.rchild =Node(2)
head.lchild.lchild.rchild.parent = head.lchild.lchild
head.lchild.rchild =Node(4)
head.lchild.rchild.parent = head.lchild
head.lchild.rchild.rchild=Node(5)
head.lchild.rchild.rchild.parent = head.lchild.rchild
head.rchild=Node(9)
head.rchild.parent=head
head.rchild.lchild =Node(8)
head.rchild.lchild.parent = head.rchild
head.rchild.lchild.lchild =Node(7)
head.rchild.lchild.lchild.parent = head.rchild.lchild
head.rchild.rchild =Node(10)
head.rchild.rchild.parent = head.rchild

text=head.lchild.lchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.lchild.lchild.rchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.lchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.lchild.rchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.lchild.rchild.rchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.rchild.lchild.lchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.rchild.lchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.rchild
print(text.elem,"next:",getSuccessorNode(text).elem)
text=head.rchild.rchild
print(text.elem,"next:",None)

猜你喜欢

转载自blog.csdn.net/weixin_40876685/article/details/88966460