劍指offer q50 樹節點最近的祖先

2021-09-07 01:30:43 字數 1903 閱讀 4854

#@ root: the root of searched tree

#@ nodetofind: the tree-node to be found

#@ path: the path from root to node

#@@#@@ search tree referenced by root, and return the path

#@@ from root to node, if node not exist, path =

#@@def getpath(root, nodetofind, path):

if ( none == root or none == nodetofind):

return false

# case 1: current root == node, so insert to path

if root == nodetofind:

path.insert(0, root)

return true

# search in left barch and right branch

bfindinleft = false

bfindinright = false

if root.left:

bfindinleft = getpath(root.left, nodetofind, path)

if false == bfindinleft and root.right :

bfindinright = getpath(root.right, nodetofind, path)

# case 2: nodetofind in subtree of root, insert root

if bfindinleft or bfindinright:

path.insert(0, root)

return true

return false

函式的功能是在root 表示的樹中查詢nodetofind 結點,若找到,則在返回的時候,將路徑結點增加到path中,關於樹的遍歷有三種。這裡我們使用後序遍歷。目的是在知道全部情況後,再對root進行處理,由於當前的結點root應不應該增加到路徑path中。不僅跟當前的結點root有關,還跟它的子結點有關,也就是若當前結點就是要找的結點,那麼將當前結點增加是沒有問題的,可是即使當前結點不是要查詢的結點,而其子樹中有查詢結點時。當前結點也是要增加到路徑中去的。這樣就不用每次都將結點插入,條件不滿足時還要進行結點的pop。

def getclosetparent(root, node1, node2):

path1 = ; path2 =

if none == root or none == node1 or none == node2:

return none

#get the path from root to node1 and node2

getpath(root, node1, path1)

getpath(root, node2, path2)

# find closet parent of node1 and node2

shorpathlen = min( len(path1), len(path2) )

for i in range(1, shorpathlen):

if path1[ i ] != path2[ i ] and \

path1[ i - 1 ] == path2[ i - 1 ]:

return path1[ i - 1 ]

return none

由於在getpath函式裡,我們獲得的路徑是從root開始的,即root為path列表的第乙個結點。那麼我們就從root開始,一次比較,找到最後乙個相等的。就是二者近的共同祖先。

劍指offer Q5 替換空格

題目描述 請實現乙個函式,把字串 s 中的每個空格替換成 20 示例 1 思路分析 1 直接使用jdk自帶的replace 方法 2 從後往前逐個替換 首先遍歷字串,統計空格數量 建立字元陣列,新陣列的長度應該為原陣列長度 2 空格數量,因為1個空格變為 20長度加2 1 使用jdk自帶方法 cla...

劍指offerQ15 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭 也就是說 先設定兩個指標,分別記錄當前節點的前乙個和 當前節點的後乙個 在每次迴圈時,next指標記錄當前的下乙個位址 head指標反指指向pre,實現反轉鍊錶 之後pre指向當前指標,head指向下乙個指標 當head為空時,pre指向鍊錶的最後乙個,輸...

《劍指offer》Q13 18 牛客10 13

目錄輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。方法1 新開陣列,先新增奇數,再新增偶數。略。方法2 1.要想保證原有次序,則只能順次移動或相鄰交換。2.i從左向右遍歷,找到第...