题目
题目地址:
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
相关题目:
如果把中序遍历换成前序遍历和后续遍历呢?
思路

中序遍历:DBHEIAFCG
如果该节点不存在右子树
- 该节点为父节点的左子节点,则下一个节点就是它的父节点
- 该节点为父节点的右子节点,沿着该节点的父节点往上遍历,直到找到一个是它父节点的左子节点的节点,如果找到这样的节点,那么这个节点的父节点就是我们要找的下一个节
- 举例:
- F 节点不存在右子树,该节点为父节点C的左子节点,则下一个节点为它(F)节点的父节点 C
- G 节点不存在右子树,该节点为父节点C的右子节点,则在该节点(G)的父节点(C)往上遍历,C是是其(C)节点的右子节点,再往上遍历到 A,由于A 是树的根节点,没有父节点,所以G 没有下一个子节点
如果该节点存在右子树
- 右子树存在左节点,则下一个节点为右子树的最左子节点
- 右子树不存在左节点,则下一个节点为右子树
- 举例:
- B 节点存在右子树,右子树左节点 H,B的下一个节点为B的右子树的最左节点 H
- E 节点存在右子树,右子树不存在左节点,则 E的下一个子节点为右子树 I
代码
边界条件
测试用例
- 普通二叉树(完全二叉树、不完全二叉树)
- 特殊二叉树(所有节点都没有右(左)子节点的二叉树,只有一个节点的二叉树,二叉树的根节点为空)
- 不同位置的下一个节点(当前节点没有下一个节点(如 G))
# -*- coding:utf-8 -*-# class TreeLinkNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None# self.next = Noneclass Solution:def GetNext(self, pNode):# write code heretarget = Noneif pNode is None:return target# 如果该节点不存在右子树# 该节点为父节点的左子节点,则下一个节点就是它的父节点# 该节点为父节点的右子节点,沿着该节点的父节点往上遍历,直到找到一个是它父节点的左子节点的节点,如果找到这样的节点,那么这个节点的父节点就是我们要找的下一个节if pNode.right is None:pCur = pNodefather = pCur.nextwhile father is not None:if father.left is not None and father.left == pCur:return fatherpCur = fatherfather = pCur.nextreturn target# 如果该节点存在右子树# 右子树存在左节点,则下一个节点为右子树的最左子节点# 右子树不存在左节点,则下一个节点为右子树pCur = pNode.rightwhile pCur is not None:if pCur.left is not None:pCur = pCur.leftelse:target = pCurbreak;return target
