#@ 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從左向右遍歷,找到第...