91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python實現的多叉樹尋找最短路徑算法示例

發布時間:2020-10-23 05:40:37 來源:腳本之家 閱讀:438 作者:稀里糊涂林老冷 欄目:開發技術

本文實例講述了Python實現的多叉樹尋找最短路徑算法。分享給大家供大家參考,具體如下:

多叉樹的最短路徑:

思想:

    傳入start 和 end 兩個 目標值
    1 找到從根節點到目標節點的路徑
    2 從所在路徑,尋找最近的公共祖先節點,
    3 對最近公共祖先根節點 拼接路徑

Python代碼:

# -*- coding:utf-8 -*-
import copy
#節點數據結構
class Node(object):
  # 初始化一個節點
  def __init__(self,value = None):
    self.value = value # 節點值
    self.child_list = []  # 子節點列表
  # 添加一個孩子節點
  def add_child(self,node):
    self.child_list.append(node)
# 初始化一顆測試二叉樹
def init():
  '''
  初始化一顆測試二叉樹:
      A
    B  C  D
   EFG    HIJ
  '''
  root = Node('A')
  B = Node('B')
  root.add_child(B)
  root.add_child(Node('C'))
  D = Node('D')
  root.add_child(D)
  B.add_child(Node('E'))
  B.add_child(Node('F'))
  B.add_child(Node('G'))
  D.add_child(Node('H'))
  D.add_child(Node('I'))
  D.add_child(Node('J'))
  return root
# 深度優先查找 返回從根節點到目標節點的路徑
def deep_first_search(cur,val,path=[]):
  path.append(cur.value) # 當前節點值添加路徑列表
  if cur.value == val:  # 如果找到目標 返回路徑列表
    return path
  if cur.child_list == []:  # 如果沒有孩子列表 就 返回 no 回溯標記
    return 'no'
  for node in cur.child_list: # 對孩子列表里的每個孩子 進行遞歸
    t_path = copy.deepcopy(path)  # 深拷貝當前路徑列表
    res = deep_first_search(node,val,t_path)
    if res == 'no': # 如果返回no,說明找到頭 沒找到 利用臨時路徑繼續找下一個孩子節點
      continue
    else :
      return res # 如果返回的不是no 說明 找到了路徑
  return 'no' # 如果所有孩子都沒找到 則 回溯
# 獲取最短路徑 傳入兩個節點值,返回結果
def get_shortest_path( start,end ):
  # 分別獲取 從根節點 到start 和end 的路徑列表,如果沒有目標節點 就返回no
  path2 = deep_first_search(root, start, [])
  path3 = deep_first_search(root, end, [])
  if path2 == 'no' or path3 == 'no':
    return '無窮大','無節點'
  # 對兩個路徑 從尾巴開始向頭 找到最近的公共根節點,合并根節點
  len1,len2 = len(path2),len(path3)
  for i in range(len1-1,-1,-1):
    if path2[i] in path3:
      index = path3.index(path2[i])
      path3 = path3[index:]
      path2 = path2[-1:i:-1]
      break
  res = path2+path3
  length = len(res)
  path = '->'.join(res)
  return '%s:%s'%(length,path)
# 主函數、程序入口
if __name__ == '__main__':
  root = init()
  res = get_shortest_path('F','I')
  print(res)

運行結果:

5:F->B->A->D->I

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python編碼操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北流市| 罗田县| 淮安市| 乌拉特中旗| 揭西县| 富平县| 陆丰市| 渝中区| 茶陵县| 江源县| 洛南县| 松滋市| 阳泉市| 钦州市| 西城区| 革吉县| 南康市| 长阳| 东阳市| 永善县| 靖江市| 湘潭市| 阿图什市| 兰西县| 潢川县| 封丘县| 贺州市| 中方县| 商水县| 连城县| 博爱县| 伊春市| 乐都县| 稻城县| 上饶市| 湖州市| 辛集市| 沾益县| 缙云县| 关岭| 岳阳县|