题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到父节点没有父节点并且父节点是父节点的父节点的左孩子为止。综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。
# _*_encoding:utf-8 _*_
class TreeNode:
#建立二叉树节点的属性
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# parent 在第一题中不需要用到
# 为了方便第二题,在重建的时候把父节点也找出来
self.parent = None
class Solution:
def get_next_node(self, node):
"""
获取下一个节点
"""
if not node:
return None
if node.right:
# 如果存在有右节点,那么下一个节点就是右子树的最左节点
node = node.right
while node.left:
node = node.left
return node
elif node.parent:
# 如果存在父节点
# 下一个节点一直向上遍历,直到找到一个节点是另外一个节点的左节点,
# 或者遍历到达根节点了,那么不存在下一个节点
while node.parent and node.parent.right == node:
# 循环向上遍历,只到找到不是某个节点的右节点或者到达根节点
# 情况1:一个节点是父节点的左节点,那么下一个节点是这个父节点
# 情况2: 达到根节点,根节点的父节点为None
node = node.parent
return node.parent
# 否则不存在下一个节点
return None
关键在标黄的一句上,当前节点父节点存在且当前节点为父节点的右节点,node=node.parent不断循环。直到该节点为左节点or到达根节点。
https://blog.youkuaiyun.com/l_vip/article/details/78735556