一、暴力解法,思路比较好理顺
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def __init__(self):
self.result = []
def mid_order(self,pRoot):
if not pRoot:
return self.result
self.mid_order(pRoot.left)
self.result.append(pRoot)
self.mid_order(pRoot.right)
def GetNext(self, pNode):
# write code here
pRoot = TreeLinkNode(0)
temp = pNode
while temp:
pRoot = temp
temp = temp.next
self.mid_order(pRoot)
lens = len(self.result)
for i in range(lens):
if self.result[i] == pNode and i+1!=lens:
return self.result[i+1]
return
二、优化法
需要分两种情况进行考虑
- 有右子树,则下一个节点在右子树中产生。
- 右子树不存在左分支,则下一节点为该子树的根节点,即该节点的右节点
- 右子树存在左分支,则需要不断寻找左分支的左节点
- 没有右子树
- 如该节点为父节点的左孩子,则下一节点即为该节点的父节点
- 如为右孩子,则需要寻找该节点的父节点
# -*- 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
if pNode.right:
pNode = pNode.right
while pNode.left:
pNode = pNode.left
return pNode
while pNode.next:
if pNode.next.left == pNode:
return pNode.next
pNode = pNode.next
return None