1、题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2、代码详解
三种情况:
- 当前节点有右子树的话,当前节点的下一个结点是右子树中的最左子节点;
- 当前节点无右子树但是是父节点的左子节点,下一个节点是当前结点的父节点;
- 当前节点无右子树而且是父节点的右子节点,则一直向上遍历,直到找到最靠近的一个祖先节点pNode,pNode是其父节点的左子节点,那么输入节点的下一个结点就是pNode的父节点。
# -*- 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 == None:
return None
# 1、寻找右子树,如果存在就一直找,直到右子树的最左边就是下一个节点
if pNode.right:
tmpNode = pNode.right
while tmpNode.left:
tmpNode = tmpNode.left
return tmpNode
else:
# 2、没有右子树,就寻找他的父节点,直到找到它是父节点的左子树,打印父节点
tmpNode = pNode
while tmpNode.next:
if tmpNode.next.left == tmpNode:
return tmpNode.next
tmpNode = tmpNode.next # 重新赋值,下次循环中继续找父节点的父节点
return None