刷題系列 - 在給出二叉樹中兩個點,求出其最小共同父節點

張國平發表於2020-02-14

繼續刷題,感覺刷題還有樂趣的,搞得都不想去研究量化策略了。如果以前讀書時候有這樣刷題網站,簡單而方便思考實現,估計我的計算機分數會好很多。


題目是在給出二叉樹中兩個點p,q,求出其最小共同父節點(LCA Lowest Common Ancestor),如下圖很好理解,比如5和1的共同父節點是3;6和7的最小共同父節點是5;而5和4的最小共同父節點是5本身。


考慮了一下,其實思路很簡答,首先用前序或者層級遍歷二叉樹得出節點佇列,因為前序和層級都是先遍歷父節點再子節點,這樣佇列後的節點的父節點一定存在佇列中。然後從後往前反序遍歷這個節點佇列,如果是給出p, q這兩個中的父節點,則替換為其父節點,如果p和q是同一個節點,就是其最小共同父節點。


程式碼如下,使用層級遍歷,遍歷的時候判斷是否已經讀取p,q;如果都讀取了停止遍歷,避免讀取不必要資料。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        preNodeList = []
        checkList = [root]
        count = 2 
        while count > 0:
            nextList = []
            for node in checkList:
                preNodeList.append(node)
                if node == p or node == q:
                    count = count -1
                if count == 0:
                    pass
                if node.left != None:
                    nextList.append(node.left)
                if node.right != None:
                    nextList.append(node.right)
            checkList = nextList
            
        while p!= q:
            currentNode = preNodeList.pop()
            if currentNode.right == p or currentNode.left == p:
                p = currentNode
            if currentNode.right == q or currentNode.left == q:
                q = currentNode
        return p


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2675528/,如需轉載,請註明出處,否則將追究法律責任。

相關文章