剑指offer-8 二叉树的下一个结点
一、题目描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。
示例:
输入:{8,6,10,5,7,9,11},8
返回:9
解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针。
二、解题
1.解题思路
(1)如果有右子树,则找右子树的最左节点
(2)没右子树,则找第一个当前节点是父节点左孩子的节点
2.代码实现
class Solution:
def GetNext(self, pNode):
#判空
if pNode==None:return None
#如果有右子树,则寻找右子树的最左侧
if pNode.right:
pNoderight=pNode.right
#只要右子树的左子树不为空
while pNoderight.left:
#此时的pNoderight 等于它的在子树
pNoderight=pNoderight.left
return pNoderight
#如果没有右子树的话
if pNode.right==None:
#当前节点是左子树的左节点,他的下一个节点是他的父节点
while pNode.next:
if pNode.next.left==pNode:
return pNode.next
else:
pNode=pNode.next
#如果当前节点是左子树的右节点,如果他的父节点是他祖父节点的左节点,那他的下一个就是他的父节点