题目
思路
本题需要理解二叉树中序遍历:左->中->右。
在对二叉树进行中序遍历时,可以总结出如下几种情况:
一:
当前节点有右子树。
遵循【左->中->右】的顺序,它的左子树已遍历完成,作为根节点它也已遍历过,因此它的下一个节点在它的右子树中。在当前节点的右子树中进行树的中序遍历,第一个节点就是当前节点的下一个节点。
例: 节点 b 的下一个节点就是 h,节点 a 的下一个节点就是 f。
二:
当前节点没有右子树。
这个情况下有两种情况。
a.当前节点是它父节点的左节点,那么它的下一个节点就是它的父节点。
例: 节点 d 的下一个节点就是 b,节点f的下一个节点就是 c。
b.当前节点是它父节点的右节点,沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左节点的节点。如果存在这样的节点,那么这个节点的父节点就是下一个节点。
例:i的下一个节点是a节点
二叉树的定义
class Binary_Tree():
def __init__(self, root=None, left=None, right=None, parent=None):
self.root = root
self.left = left
self.right = right
self.parent = parent
题解
def find_next_node(pNode):
# 是否非空节点
if not pNode:
return None
p_parent = pNode.parent
# 是否有右子树
if pNode.right:
pNode = pNode.right
while pNode.left:
# 当前的左子树的叶子
pNode = pNode.left
return pNode
else:
# 如果当前节点是它父节点的左子树
if p_parent and p_parent.left == pNode:
return p_parent
elif p_parent and p_parent.right == pNode:
while p_parent.parent:
if p_parent.parent.left == p_parent:
return p_parent.next
else:
p_parent = p_parent.next
如果有问题,欢迎大家指出哦~~