题目要求:
描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
思路:
思路1:递归(伪代码)
获取下个节点函数(当前节点):
如果当前节点有右子节点:
#中序遍历,说明左子树和本身已被遍历,接下来要先进行遍历右子树
递归右子节点
如果当前节点无右子节点,看本身有无next节点:
#中序遍历,说明左子树和本身已被遍历,接下来要进行遍历右子树
递归next节点
否则:
当前节点无next,返回None
递归右子节点函数(当前节点):
如果当前节点有左子节点:
继续递归左子节点(因为中序遍历,左优先)
否则:
返回当前节点(中序遍历顺序,左,根,右)
递归next节点函数(当前节点):
如果当前节点next节点为空:
说明该节点为根节点(到递归next说明以当前节点为根节点的子树已经被全部遍历)
判断当前节点是以next节点为根的左子节点:
如果是,则由于以左子节点为根的树被全部遍历,next节点作为左子树的根,就是下一个要被遍历的节点,直接返回next节点即可
否则:
#走到这说明当前节点是以next节点为根的右子节点,next节点也被全部遍历,需要往上一层继续查找
继续递归next节点
思路2:循环(伪代码)
获取下个节点函数(当前节点):
如果当前节点有右子节点:
#中序遍历,说明左子树和本身已被遍历,接下来要先进行遍历右子树
while True
如果当前节点无左子节点退出循环
否则将当前节点指向左子节点继续循环
返回循环最终得到的节点
如果当前节点无右子节点,看本身有无next节点:
#中序遍历,说明左子树和本身已被遍历,接下来要进行遍历右子树
如果当前节点有next节点就一直循环:
如果当前节点是以next节点为根的左子节点退出循环
否则将当前节点指向next子节点继续循环
返回循环最终得到的节点
否则:
当前节点无next,返回None
代码如下:
思路1:递归
# -*- 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):
if pNode.right != None:
pNode = pNode.right
return self.findRight(pNode)
elif pNode.next != None:
return self.findNext(pNode)
else:
return None
def findRight(self,pNode):
if pNode.left == None:
return pNode
else:
return self.findRight(pNode.left)
def findNext(self,pNode):
if pNode.next == None:
return None
elif pNode.next.left == pNode:
return pNode.next
else:
return self.findNext(pNode.next)
思路2:循环
# -*- 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):
if pNode.right != None:
pNode = pNode.right
while 1:
if pNode.left == None:
break
pNode = pNode.left
return pNode
elif pNode.next != None:
while pNode.next:
if pNode.next.left == pNode:
break
pNode = pNode.next
return pNode.next
else:
return None
运行效果:
思路1:递归
思路2:循环