题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
# 构造树结构
class ListTreeNode():
def __init__(self, x):
self.val = x # 结点数据
self.left = None # 左指针
self.right = None # 右指针
self.next = None # 指向父节点的指针
# 根据中序遍历顺序查找下一个节点
class Solution():
def find_node(self, pNode):
if not pNode:
return
# 1.如果一个节点有右子树,那么它的下一个节点就是它右子树中的最左子结点
elif pNode.right != None:
pNode = pNode.right
while pNode.left != None:
pNode = pNode.left
return pNode
# 2.如果一个节点没有右子树,并且它还是它父节点的右子树节点
elif pNode.next != None and pNode.next.right == pNode:
while pNode.next != None and pNode.next.left != pNode:
pNode = pNode.next
return pNode.next
# 3.如果一个结点是它父节点的左子结点,那么直接返回它的父节点
else:
pNode = pNode.next
return pNode
# 输出树
res = []
def search_tree(construct_tree):
if construct_tree is not None:
res.append(construct_tree.val)
search_tree(construct_tree.left)
search_tree(construct_tree.right)
return res
if __name__=="__main__":
# 测试-》构造一棵树
construct_tree = ListTreeNode('a')
construct_tree.left = ListTreeNode('b')
construct_tree.left.next = ListTreeNode('a')
construct_tree.right = ListTreeNode('c')
construct_tree.right.next = ListTreeNode('a')
# 输出构造的树
res = search_tree(construct_tree)
# 输出中序遍历的下一个节点
s = Solution()
result = s.find_node(construct_tree.left).val
print(result)