您的位置:首页 > 编程语言 > Python开发

二叉树的下一个结点(二叉树中序遍历的使用)

2017-01-29 00:08 218 查看


题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。
第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,否则没有。

# -*- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM python