题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。
第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,否则没有。
# -*- 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
def Get_In_Order(root):
u"获取二叉树的中序遍历"
if root.left:
Get_In_Order(root.left)
res.append(root)
if root.right:
Get_In_Order(root.right)
if not pNode:
return None
temp = pNode
# 获取根结点
while temp.next:
temp = temp.next
res = []
Get_In_Order(temp) # 查找中序遍历序列
for index, value in enumerate(res): # 遍历中序序列,找到下一个节点
if value == pNode:
if index < len(res) - 1: # 需要查找的结点不是最后一个结点
return res[index + 1]
return None
第二种方法,使用循环进行查找
两个方向进行讨论:
1.如果当前结点的右结点不为空,则往右结点方向进行遍历,如图所示
遍历到右结点以后,遍历右结点的左结点,一直到左结点的叶子结点
2.如果当前结点的右结点为空,则往上遍历,查找父结点,如果父结点的左子树等于给定结点的话,则该父结点就是要查找的结点,否则的话,则继续查找,要对每一步进行判断父结点的左子树是否等于给定结点,如果相等,则该结点就是要查找的结果,否则,当循环结束以后,则证明没有找到,返回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 not pNode:
return None
p = pNode
if p.right:
if not p.right.left:
return p.right
pr = p.right
# 一直遍历该右结点的左子树,直到遍历到叶子结点,此时获得的结点就是pNode的下一个结点
# while循环的两个条件不能少,第一个是要得到的结果,第二个只有不为空的时候才能给pr赋值
while pr and pr.left:
pr = pr.left
return pr
else:
if p.next:
# p结点是父结点的左子树上的结点,则直接返回父结点
if p.next.left == p:
return p.next
while p.next:
# 继续遍历父结点
# 这种情况的解释看图示
if p.next.left and p.next.left == p:
return p.next
p = p.next
return None