题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题目地址
思路
三种情况
1)当前结点有右子树。当前结点的下一结点是右子树中的最左子结点,如node=8,它的下一结点为12.
2)当前结点无右子树,且当前结点是其父结点的左孩子。下一结点为当前结点的父结点,如node=8,它的下一个结点为12。
3)当前结点无右子树,且当前结点是其父结点的右孩子。则一直向上遍历,直到找到最靠近的一个祖先节点pNode且pNode是其父节点的左子节点,那么输入节点的下一个结点就是pNode的父节点。如node=14,它的下一个结点为16.
Python
# -*- coding:utf-8 -*- class TreeLinkNode: def __init__(self, x): self.val = x self.left = None self.right = None self.next = None node1 = TreeLinkNode(1) node2 = TreeLinkNode(2) node3 = TreeLinkNode(3) node4 = TreeLinkNode(4) node5 = TreeLinkNode(5) node1.left = node2 node1.right = node3 node3.left = node4 node4.right = node5 node2.next = node1 node3.next = node1 node4.next = node3 node5.next = node4 class Solution: def GetNext(self, pNode): # write code here pNext = None # 如果以下都不满足返回空 if not pNode: pNext = pNode if pNode.right: # 如果当前结点有右子树,则下一结点在右子树的最下左结点 pNode = pNode.right while pNode.left: pNode = pNode.left pNext = pNode else: if pNode.next and pNode == pNode.next.left: # 如果当前结点有父结点并且当前结点是父结点的左子结点,下一结点为父结点 pNext = pNode.next elif pNode.next and pNode == pNode.next.right: # 如果当前结点有父结点并且当前结点是父结点的右子结点,向上遍历 pNode = pNode.next while pNode.next and pNode == pNode.next.right: pNode = pNode.next # 当遍历到当前结点为父结点的左子结点时,输入结点的下一个结点为当前结点的父结点 if pNode.next: pNext = pNode.next return pNext if __name__ == '__main__': result = Solution().GetNext(node1)
作者:huangqiancun
出处:http://www.cnblogs.com/huangqiancun/
本博客若无特殊说明则由作者原创发布,欢迎转载,但请注明出处 :)