題目描述:
給定一棵二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了有兩個分別指向左、右子節點的指針,還有一個指向父節點的指針。
解題思路:
這道題意即:給定一個節點,按照中序遍歷(左根右)的方式求該節點的下一個節點。有三種情況:
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
