题目:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点出了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针
结合图,可以将问题分成两大类:
1、该节点有右子树,那么下一个节点就是该节点的右子树中最左子节点,例如:b节点的下一个节点是h
2、该节点没有右子树
(1)该节点为父节点的左子节点,那么下一个节点是父节点。例如:d的下一个节点是b,f的下一个节点是c
(2)该节点为父节点的右子节点,那么下一个节点是沿着指向父节点的指针一直向上遍历,直到找到是它父节点的左子节点的节点。例如:i的下一个节点需要沿着父节点一直往上找,直到当前结点是其父节点的左孩子位置(b),那 i 的下一个节点就是 b 的父节点。
class TreeLinkNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.next = None
def GetNext(pNode):
# 传入空指针,返回None
if not pNode:return None
p = pNode
# 有右子树,下一个节点就是右子树中最左节点
if pNode.right:
p = pNode.right
while p.left:
p = p.left
return p
# 没有右子树,但是有父亲节点,且该节点为父节点的右子树
# 循环找到一个节点,该节点为它父节点的左子节点
# 如果当前节点为左子节点,即 pNode.next.right != pNode ,则下一个节点就是父节点
while pNode.next and pNode.next.right == pNode:
pNode = pNode.next
return pNode.next