1. 程式人生 > >劍指offer 57. 二叉樹的下一個結點

劍指offer 57. 二叉樹的下一個結點

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

思路:

(1) 若該節點存在右子樹:則下一個節點為右子樹最左子節點
(2) 若該節點不存在右子樹:這時分兩種情況:
2.1 該節點為父節點的左子節點,則下一個節點為其父節點
2.2 該節點為父節點的右子節點,則沿著父節點向上遍歷,知道找到一個節點的父節點的左子節點為該節點,
則該節點的父節點下一個節點(如圖節點I,沿著父節點一直向上查詢找到B(B為其父節點的左子節點),
則B的父節點A為下一個節點)。

參考答案:

# -*- 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
        # 該節點有右子節點,那麼該節點的下一個節點就是有自己節點的最左節點
        if pNode.right != None:
            pNode = pNode.right
            while pNode.left != None:
                pNode = pNode.left
            return pNode
        # 該節點沒有右子節點
        # 該節點為父節點的左子節點
        elif pNode.next != None and pNode.next.left == pNode:
            return pNode.next
        # 該節點為父節點的右子節點,它的下一個節點就是其父節點作為父節點的左子節點的下一個節點
        elif pNode.next != None and pNode.next.right == pNode:
            while pNode.next != None and pNode.next.left != pNode:
                pNode = pNode.next
            return pNode.next
        else:
            # 節點無父節點,即節點為根節點
            return pNode.next


Note

  • 這道題很值得琢磨,其中三種情況,要爛熟於心。