劍指Offer 68 樹中兩個結點的最低公共祖先

2021-09-02 23:06:38 字數 2946 閱讀 1112

給出乙個二叉樹,輸入兩個樹節點,求它們的最低公共祖先。

乙個樹節點的祖先節點包括它本身。

注意:輸入的二叉樹不為空;

輸入的兩個節點一定不為空,且是二叉樹中的節點;

解法一,使用遞迴,若兩個樹節點在根節點的左右子樹上,則公共節點為根節點;若兩個樹節點都在某一子樹上,則公共節點在該子樹上。這個方法遞迴都要查詢某一子樹上是否有節點存在,時間複雜度較高。

# definition for a binary tree node.

# class treenode(object):

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

(object):

deflowestcommonancestor

(self, root, p, q)

:"""

:type root: treenode

:type p: treenode

:type q: treenode

:rtype: treenode

"""if root == q or root == p:

return root

ifnot root.left:

return self.lowestcommonancestor(root.right, p, q)

ifnot root.right:

return self.lowestcommonancestor(root.left, p, q)

pinlefttree, qinlefttree = self.isnodeintree(root.left, p)

, self.isnodeintree(root.left, q)

if pinlefttree and qinlefttree:

return self.lowestcommonancestor(root.left, p, q)

ifnot pinlefttree and

not qinlefttree:

return self.lowestcommonancestor(root.right, p, q)

return root

defisnodeintree

(self, root, node)

:if root == node:

return

true

return

(root.left and self.isnodeintree(root.left, node))or

(root.right and self.isnodeintree(root.right, node)

)

解法二,先找出從根節點到兩個樹節點的路徑,然後轉化為求兩個鍊錶的公共節點。

# definition for a binary tree node.

# class treenode(object):

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

(object):

deflowestcommonancestor

(self, root, p, q)

:"""

:type root: treenode

:type p: treenode

:type q: treenode

:rtype: treenode

"""pathtop, pathtoq =

, self.iterate(root, p, pathtop)

self.iterate(root, q, pathtoq)

diff =

len(pathtop)

-len

(pathtoq)

if diff <0:

startq =

len(pathtoq)-1

+ diff

startp =

len(pathtop)-1

else

: startp =

len(pathtop)-1

- diff

startq =

len(pathtoq)-1

while

(startp >=0)

:if pathtop[startp]

== pathtoq[startq]

:return pathtop[startp]

else

: startp -=

1 startq -=

1def

iterate

(self, root, node, path)

:if root == node:

return

true

if root.left:

if self.iterate(root.left, node, path)

:return

true

if root.right:

if self.iterate(root.right, node, path)

:return

true

path.pop(

)

《劍指offer》樹中兩個結點的最低公共祖先

說實話,和這題很有緣分。首先,這個題目給我印象很深,其次,今天在做蘑菇街實習生筆試時遇到了這個題目,所以感覺應該寫部落格,把這個題目記錄下來。筆試時遇到的題目是 給定二叉樹中的兩個結點,尋找最低公共節點。這是一種情況,是比較簡單的情況。這種情況就相當於求兩條鍊錶的公共節點。求解很簡單,先把遍歷把兩條...

劍指offer 68 節點的公共祖先

初始 給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。思路 對於二叉搜尋樹其後序遍歷有序,因此若當前節點的值大於兩個節點的值,則說明這兩個節點在當前節點的左子樹中,若當前節點的值小於兩個節點的值,則說明這兩個節點在當前節點的右子樹中。class solution if root.val p...

劍指Offer 68 二叉樹的最近公共祖先

迴圈搜尋 當節點 root 為空時跳出 當 p,q都在 root 的 右子樹 中,則遍歷至 root.right 否則,當 p,q 都在 root 的 左子樹 中,則遍歷至 root.left 否則,說明找到了 最近公共祖先 跳出。返回值 最近公共祖先 root treenode lowestcom...