题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
方法一:
根据题意,既然是找出中序遍历的下一个节点,那就先进行中序遍历,将节点存于数组,返回要求节点的下一个节点即可,注意若要求节点为最后一个节点,则返回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):
self.res = []
dummy = pNode
while dummy.next:
dummy = dummy.next
self.mid_travel(dummy)
for i in range(len(self.res)):
if self.res[i] == pNode:
if i < len(self.res) -1:
return self.res[i+1]
else:
return None
def mid_travel(self, root):
if not root:
return
self.mid_travel(root.left)
self.res.append(root)
self.mid_travel(root.right)
方法二:
根据分析可以得出思路:
第一种情况:要求节点有右子树,则返回右子树的最左节点
(如上图,如果要求节点为A,则返回F节点)
第二种情况:要求节点无右子树,向父节点遍历,直到寻找到某个节点的父节点的左子树为该节点的节点,若没有找到,则返回None
(如上图,如果要求节点为I,则返回A节点,因为一直向上寻找父节点,当寻找到B节点时,B的父节点的左子树为B节点,所有返回B.next)
(如上图,如果要求节点为G,找不到,所有返回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):
# 有右子树,下一节点为右子树的最左节点
if pNode.right:
p = pNode.right
while p.left:
p = p.left
return p
# 无右子树,寻找某个节点的父节点的左子树为该节点的节点
while pNode.next:
if pNode.next.left == pNode:
return pNode.next
pNode = pNode.next
# 未找到符合要求的节点
return
-------------------------------------------------------------------------------------------------------------------------------------
更多题目包括leetcode、牛客网、各种排序算法解法参见个人GitHub,持续更新中,欢迎star ~~
https://github.com/PemLer/Journey_of_leetcode
-------------------------------------------------------------------------------------------------------------------------------------