题目
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
找到中序遍历下一个节点的规律
- 一个节点有右子树,下一个节点是右子树的最左子节点。
- 没有右子树,且是父节点的左节点,下一个节点是父节点。
- 没有右子树,且是父节点的右节点,下一个节点是向上遍历父节点,直到找到一个父节点,是它自己的父节点的左节点,下一个节点就是它自己的父节点。(画图理解)如果没有父节点是左节点,那么就没有下一个节点。
代码
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 == None:
return None
if pNode.right != None: #有右子树
rNode = pNode.right #右子树
while rNode.left != None:
rNode = rNode.left # 右子树的最左子节点
return rNode
else: # 无右子树
if pNode.next != None:
if pNode.next.left == pNode: # 是左节点
return pNode.next # 下个节点是父节点
elif pNode.next.right == pNode: #是右节点
lNode = pNode.next # 父节点
while lNode.next != None and lNode.next.left != lNode: # 不是根结点且父节点不是左节点
lNode = lNode.next
return lNode.next
else:
return None
遇到的问题
在无右子树要取父节点时,没判断父节点是否为空。
问题一开始要判断给的节点是否为空
特殊测试用例:
所有节点都没有右/左子节点的二叉树;
只有一个节点的二叉树;
二叉树根节点为空。
注意细节。