给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
1.每种数据结构的最小单元都是通过编程语言的类定义的,实际的数据结构就是由一个个类的实例组合成的。
2.二叉树的结构很特别,一个结点可以是父结点,也同时可以是子结点。一棵树的子树同样是二叉树。所以二叉树问题经常用到递归的方法。
3.前中后序遍历
假如一个二叉树只有一个根结点,一个左结点,一个右结点。
前序遍历:根结点->左子结点->右子结点
中序遍历:左子结点->根结点->右子结点
后序遍历:左子结点->右子结点->根结点
但是如果二叉树没那么简单,以前序遍历为例,找到根节点之后,发现左结点还有自己的子结点。这时候在左结点再次按照前序遍历的规则从左结点开始,直到找到单一的结点。这个过程就是典型的递归。
class Node:
def __init__(val):
self.val = val
self.left = None
self.right = None
def PreOrderTravel(head):
print(head.val)
PreOrderTravel(head.left)
PreOrderTravel(head.right)
普适的遍历规则:
- 前序遍历:根左右。先打印,再遍历左子树,再遍历右子树;
- 中序遍历:左根右。先遍历左子树,再打印,再遍历右子树;
- 后序遍历:左右根。先遍历左子树,再遍历右子树,再打印。
这个题就是根据中序遍历,找某个节点的搜索到的下一个结点。
首先想到 就是如果一个结点有右子树的话,就接着遍历他的右子树就可以了。如果它没有右子树的话,按照中序遍历的规则,某一个结点被打印了,说明它的左子树已经遍历完了,所以左子树不用考虑了。本应该遍历右子树,却发现没有右子树。这时候就应该返回上一层了,这个结点作为它上面某个结点的子结点,而且必须是左子结点,因为只有遍历完左子树才打印子结点的父结点。如果是右子结点说明父结点已经被遍历完了,也就是说父结点这个子树遍历完了,所以下一个遍历就应该是父结点的父结点了,以此类推一次找爹之旅就开始了,直到找到一个结点是左子结点,本身向上搜索就说明被搜索的结点都是中序遍历过的,只要某个结点是左子结点,按照规则就该遍历父结点了。
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