給定乙個二叉樹和其中乙個節點,找出該節點在中序遍歷序列中的下乙個節點。
注意:
樹中的節點除了有兩個分別指向左右子節點的指標,還有乙個指向父節點的指標。
如果給定的節點是中序遍歷序列的最後乙個,則返回空節點。
二叉樹一定不為空,且給定的節點一定不是空節點。
分情況討論即可,如下圖所示:
如果當前節點有右孩子,則右子樹中最左側的節點就是當前節點的後繼。比如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...