(python版)《劍指Offer》JZ57:二叉樹的下一個結點

龍共日堯發表於2020-12-07

牛客
在這裡插入圖片描述
在這裡插入圖片描述
我們以上圖為例進行講解,上圖二叉樹的中序遍歷是d,b,h,e,i,a,f,c,g。我們以這棵樹為例來分析如何找出二叉樹的下一個結點。

  • 如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹的最左子結點。也就是說從右子結點出發一直沿著指向左子樹結點的指標,我們就能找到它的下一個結點。例如,圖中結點b的下一個結點是h,結點a的下一個結點是f。

  • 接著我們分析一下結點沒有右子樹的情形。如果結點是它父結點的左子結點,那麼它的下一個結點就是它的父結點。例如,途中結點d的父節點(next)是b,f的父節點(next)是c。

  • 如果一個結點既沒有右子樹,並且它還是父結點的右子結點,我們可以沿著指向父結點的指標一直向上遍歷,直到找到一個是它父結點的左子結點的結點
    如果這樣的結點存在,那麼這個結點的父結點就是我們要找的下一個結點。
    例如,為了找到結點g的下一個結點,我們沿著指向父結點的指標向上遍歷,先到達結點c。由於結點c是父結點a的右結點,我們繼續向上遍歷到達結點a。由於結點a是樹的根結點。它沒有父結點。因此結點g沒有下一個結點。

# -*- 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 None
        if not pNode.left and not pNode.right and not pNode.next:
            return None
        # 如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹的最左子結點
        if pNode.right:
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            return pNode
        
        # 如果沒有右孩子但是有父節點
        while pNode.next:
            father = pNode.next
            if father.left == pNode:    # 若該節點是其父節點的左孩子
                return father           # 則下一節點就為父節點
            pNode = father              # 若該節點是其父節點的右孩子,找父節點的父節點,若到根節點(再無父節點了),退出迴圈,返回None
        return None

# 若該節點是其父節點的右孩子,找父節點的父節點,若到根節點(再無父節點了),退出迴圈,返回None

https://cuijiahua.com/blog/2018/01/basis_57.html
https://blog.csdn.net/u014568072/article/details/87910843

相關文章