劍指offer 8 二叉樹的下乙個節點

2021-10-04 22:03:33 字數 1490 閱讀 2875

給定乙個二叉樹和其中乙個節點,找出該節點在中序遍歷序列中的下乙個節點。

注意:

樹中的節點除了有兩個分別指向左右子節點的指標,還有乙個指向父節點的指標。

如果給定的節點是中序遍歷序列的最後乙個,則返回空節點。

二叉樹一定不為空,且給定的節點一定不是空節點。

分情況討論即可,如下圖所示:

如果當前節點有右孩子,則右子樹中最左側的節點就是當前節點的後繼。比如f的後繼不是e而是h。尋找過程和中序遍歷找最左子節點的過程是一致的。

如果當前節點沒有右孩子,則需要沿著father域一直向上找。比如a的後繼是其父節點c,但d的後繼是父節點的父節點f。

找到第乙個是其father左孩子的節點,該節點的father就是當前節點的後繼。比如當前節點是d,則d的father域中第乙個滿足是其father左孩子的節點是c,則c的父節點f即為d的後繼。

【因為中序是左孩子–根--右孩子,從左孩子回溯到的父節點才有可能是後繼節點,從右孩子回溯到的父節點一定是前驅節點】

# definition for a binary tree node.

# class treenode(object):

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

# self.father = none ####### 這裡和之前不同

class

solution

(object):

definordersuccessor

(self, q)

:"""

:type q: treenode

:rtype: treenode

"""# 如果 q有右孩子節點,則尋找其右子樹中的最左子節點

if q.right:

q = q.right # 後繼不一定是其右孩子節點!需要找!

while q.left:

q = q.left

return q

# 如果 q 無右孩子節點,則向上看父節點

# 如果 q 是父節點的右孩子節點,則繼續向上尋找

while q.father and q == q.father.right:

q = q.father

# 跳出迴圈的幾種情況:

# [1] q是根節點(q.father==none),[2] q是其父節點的左孩子

return q.father

# [1] 根節點了仍然沒跳出說明該節點在右子樹的最右節點,是整個二叉樹的結尾,沒有後繼節點,因此返回q.father即none

# [2] q是其父節點的左孩子,返回父節點q.father即後繼節點

劍指offer 8 二叉樹的下乙個結點

include include includetypedef int datatype typedef struct bstreenode bstreenode bstreenode createnode int data 首先利用棧實現二叉樹的非遞迴中序遍歷,從根結點開始,當根結點不為空或者棧不為...

劍指Offer 8 二叉樹的下乙個節點

給定一棵二叉樹和其中的乙個結點,如何找出中序遍歷順序的下乙個結點?樹中的結點除了有兩個分別指向左右子結點的指標以外,還有乙個指向父結點的指標。主要分為兩種情況 如果乙個節點的右子樹不為空,那麼在中序遍歷的下乙個節點就是其 右子樹的最左節點 如果乙個節點的右子樹為空,那麼在中序遍歷的下乙個節點就是其 ...

劍指Offer 8 二叉樹的下乙個結點

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