题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
根据当前节点求二叉树中序遍历的下一节点,需要分成几种情况进行求解:
1、若当前节点存在右节点,则直接返回当前节点的右节点下的最后一个左节点。
if pNode.right:
temp = pNode.right
# 若存在右节点,则返回右节点的下的最后一个左节点
while temp.left:
temp = temp.left
return temp
# 求解根节点
2、判断当前节点是否存在父节点
2.1 若当前节点存在父节点
2.1.1、在存在父节点的情况下,判断当前节点是否是左节点,如果是左节点,则直接返回当前节点的父节点
if pNode.next.left and (pNode.next.left == pNode):
return pNode.next
2.1.2、在存在父节点的情况下,判断当前节点是否是右节点
2.1.2.1 判断当前节点是否是最后一个右节点,如果是树的最后一个右节点,返回空
while root.right:
root = root.right
# 若当前节点是最后一个右节点,则返回空
if pNode == root:
return None
2.1.2.2 若当前节点不是树的最后一个右节点,返回当前节点的父节点的父节点
return pNode.next.next
2.2 若当前节点不存在父节点,则返回空
return None
完整代码:
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode):
# write code here
# 首先判断是否存在右节点
if pNode.right:
temp = pNode.right
# 若存在右节点,则返回右节点的下的最后一个左节点
while temp.left:
temp = temp.left
return temp
# 求解根节点
root = pNode
while root.next:
root = root.next
# 判断父节点是否存在,即判断当前节点是否是根节点
if pNode.next:
# 在存在父节点的情况下,判断当前节点是否是左节点,
# 如果是左节点,则直接返回当前节点的父节点
if pNode.next.left and (pNode.next.left == pNode):
return pNode.next
# 在存在父节点的情况下,判断当前节点是否是右节点
elif pNode.next.right and (pNode.next.right == pNode):
# 判断当前节点是否是最后一个右节点
while root.right:
root = root.right
# 若当前节点是最后一个右节点,则返回空
if pNode == root:
return None
return pNode.next.next
else:
# 若当前节点的父节点不存在,则返回空
return None