題目描述:
給定一棵二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了有兩個分別指向左、右子節點的指針,還有一個指向父節點的指針。
解題思路:
這道題意即:給定一個節點,按照中序遍歷(左根右)的方式求該節點的下一個節點。有三種情況:
1. 給定的節點為空——返回空;
2. 給定的節點有右子樹——沿着該右子樹,返回右子樹的第一個左葉子節點;
3. 給定的節點沒有右子樹——如果位於某個節點的左子樹中,則上溯直至找到該節點;否則就返回空。【因為按照中序遍歷“左中右”的遍歷方式,當該節點沒有右子樹時,要么遍歷完畢,下一個節點為空;要么某個子樹的左子樹遍歷完畢,下一個節點是子樹的根節點】
# -*- 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 pNode if pNode.right:#如果一個節點存在右子樹,下一個節點為它的右子樹中的最左子節點 left1 = pNode.right while left1.left: left1 = left1.left return left1 else:#不存在右子樹 p = pNode.next#當前節點的父節點 if not p:#根節點 return None else: if p.left == pNode:#下個節點為當前節點的父節點 return p else:#當前節點沒有右子樹,並且它還是它父節點的右子節點 while p and p.right == pNode: pNode = p p = pNode.next return p