1. 主页 > 小妙招

树结构遍历实战:层次遍与深度遍历算法对比


馃尦 鏍戠粨鏋勬槸鍟ワ紵涓哄暐瑕佸閬嶅巻锛?/h3>

浣犲彲鑳借闂簡锛氣€?strong>鈥嬫爲鍙堜笉鏄幇瀹炰腑鐨勫ぇ鏍戯紝杩欑帺鎰忓効鍒板簳鏈夊暐鐢紵鈥?/strong>鈥?涓句釜鏍楀瓙馃尠锛屼綘鐨勭數鑴戞枃浠跺す鏄笉鏄竴灞傚涓€灞傦紵寰俊濂藉弸鐨勬帹鑽愭槸涓嶆槸瑕佺湅鍏卞悓鑱旂郴浜猴紵杩欎簺鑳屽悗閮芥槸鏍戠粨鏋勫湪鎼炰簨鎯咃紒

鏍戦亶鍘嗚鐧戒簡灏辨槸鈥?strong>鈥嬧€滄€庝箞鎶婃爲涓婄殑鏁版嵁涓€涓釜鎽告竻妤氣€濃€?/strong>鈥嬨€傚氨鍍忔煡鎴峰彛锛屼綘鏄粠鐖风埛杈堝紑濮嬪線涓嬫煡锛堝眰娆¢亶鍘嗭級锛岃繕鏄€潃涓€鏀棌璋卞厛鏌ュ埌搴曞啀鍥炲ご锛堟繁搴﹂亶鍘嗭級锛熼€夐敊鏂规硶锛熷皬蹇冩煡寰楀ご鏅曠溂鑺辫繕婕忎汉锛?/p>


馃殌 娣卞害浼樺厛閬嶅巻锛氫竴鏉¢亾璧板埌榛?/h3>

鈥?strong>鈥嬫牳蹇冩€濇兂鈥?/strong>鈥嬶細閫綇涓€涓垎鏀氨寰€姝婚噷鎸栵紝鎸栧埌搴曞啀鍥炲ご锛佸氨鍍忕帺杩峰锛屽彸鎵嬫懜澧欐硶灏辨槸鍏稿瀷鐨勬繁搴︿紭鍏堢瓥鐣ャ€?/p>

鎬庝箞鐜╄浆DFS锛?/h4>
  1. 鈥?strong>鈥嬮€掑綊鐗堚€?/strong>鈥嬶紙鏂版墜鍙嬪ソ浣嗗鏄撶炕杞︼級锛?/li>
python澶嶅埗
def dfs(node):
    if node is None: return
    print(node.val)  # 鍏堝鐞嗗綋鍓嶈妭鐐?/span>
    dfs(node.left)   # 鍐嶆懜宸﹀瓙鏍?/span>
    dfs(node.right)  # 鏈€鍚庢懜鍙冲瓙鏍?/span>

鈿狅笍 鈥?strong>鈥嬪潙鐐硅鍛娾€?/strong>鈥嬶細鏍戝お娣变細瑙﹀彂鈥?strong>鈥嬫爤婧㈠嚭鈥?/strong>鈥嬶紒瓒呰繃1000灞傦紵绛夌潃鎶ラ敊鍚э紒

  1. 鈥?strong>鈥嬮潪閫掑綊鐗堚€?/strong>鈥嬶紙鑰佸徃鏈哄繀澶囷級锛?br/> 鐢ㄢ€?strong>鈥嬫爤鈥?/strong>鈥嬫墜鍔ㄦā鎷熼€掑綊锛屽濡堝啀涔熶笉鐢ㄦ媴蹇冩垜鐖嗗唴瀛樺暒~
python澶嶅埗
stack = [root]
while stack:
    node = stack.pop()
    print(node.val)
    if node.right: stack.append(node.right)  # 鍙冲瀛愬厛鍏ユ爤锛?/span>
    if node.left: stack.append(node.left)     # 宸﹀瀛愬悗鍏ユ爤

馃挕 鈥?strong>鈥嬪皬鎶€宸р€?/strong>鈥嬶細鍏ユ爤椤哄簭鍙嶈繃鏉ユ墠鑳戒繚璇佸厛宸﹀悗鍙冲摝锛?/p>


馃攧 灞傛閬嶅巻锛氭寜杈堝垎鏌ユ埛鍙?/h3>

鈥?strong>鈥嬫牳蹇冩€濇兂鈥?/strong>鈥嬶細鈥?strong>鈥嬩竴灞傚眰鎵ゼ鈥?/strong>鈥嬶紝鐖风埛鈫掔埜鐖糕啋鍎垮瓙鈫掑瓩瀛愶紝缁濆涓嶈烦杈堬紒閫傚悎闇€瑕佺粺璁″鏃忔垚鍛樻暟閲忕殑鍦烘櫙銆?/p>

BFS瀹炵幇涓夋澘鏂э細

  1. 鈥?strong>鈥嬮槦鍒楀綋浼犻€佸甫鈥?/strong>鈥嬶細
python澶嶅埗
from collections import deque
queue = deque([root])
while queue:
    node = queue.popleft()
    print(node.val)
    if node.left: queue.append(node.left)
    if node.right: queue.append(node.right)
  1. 鈥?strong>鈥嬪眰绾х粺璁¢獨鎿嶄綔鈥?/strong>鈥嬶細
    鎯崇煡閬撴瘡灞傛湁澶氬皯浜猴紵鍔犱釜寰幆璁℃暟鍣ㄥ氨琛岋紒
python澶嶅埗
while queue:
    level_size = len(queue)
    for _ in range(level_size):  # 褰撳墠灞傚叏鎵畬鍐嶄笅涓€灞?/span>
        ... # 澶勭悊鑺傜偣
  1. 鈥?strong>鈥媄瀛楀瀷鎵弿鈥?/strong>鈥嬶紙闈㈣瘯瑁呴€煎繀澶囷級锛?br/> 鍔犱釜flag鍒ゆ柇濂囧伓灞傦紝鍙嶅悜鍏ラ槦绉掑彉铔囧舰璧颁綅锛侌煇?/li>

馃 姝i潰鍒氾紒DFS vs BFS 澶у鍐?/h3>
鈥?strong>鈥嬪姣旈」鈥?/strong>鈥?/th>鈥?strong>鈥嬫繁搴︿紭鍏堬紙DFS锛夆€?/strong>鈥?/th>鈥?strong>鈥嬪眰娆¢亶鍘嗭紙BFS锛夆€?/strong>鈥?/th>
鈥?strong>鈥嬫暟鎹粨鏋勨€?/strong>鈥?/td>鏍堬紙鍚庤繘鍏堝嚭锛?/td>闃熷垪锛堝厛杩涘厛鍑猴級
鈥?strong>鈥嬪唴瀛樻秷鑰椻€?/strong>鈥?/td>閫氬父O(鏍戦珮搴?閫氬父O(鏍戝搴?
鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥?/td>鏂囦欢璺緞鏌ユ壘銆佽糠瀹眰瑙?/td>绀句氦鍏崇郴鎺ㄨ崘銆佹渶鐭矾寰勭粺璁?/td>
鈥?strong>鈥嬭嚧鍛界己闄封€?/strong>鈥?/td>瓒呮繁鏍戜細鏍堟孩鍑吼煉?/td>瓒呭鏍戝唴瀛樼垎鐐葛煉?/td>
鈥?strong>鈥嬩唬鐮佸鏉傚害鈥?/strong>鈥?/td>閫掑綊鐗?琛岋紝闈為€掑綊鐗?0琛?/td>鍥哄畾濂楄矾8琛屾悶瀹?/td>

涓句釜瀹炴垬妗堜緥馃尠锛?br/> 鍋囪浣犺缁熻Git浠撳簱鐨勭増鏈巻鍙诧細

  • 鈥?strong>鈥嬬敤DFS鈥?/strong>鈥嬶細閫傚悎鏌ユ壘鏌愭潯鍒嗘敮鐨勬渶鏂癱ommit锛堟瘮濡傛煡bug鎬庝箞寮曞叆鐨勶級
  • 鈥?strong>鈥嬬敤BFS鈥?/strong>鈥嬶細閫傚悎缁熻姣忎釜鐗堟湰鐨勮础鐚€呮暟閲忥紙姣斿鍙戠増鍓嶆劅璋㈠悕鍗曪級

馃挕 鐙缁忛獙鍖咃紙涓€鑸汉鎴戜笉鍛婅瘔ta锛?/h3>
  1. 鈥?strong>鈥嬫贩鍚堝弻鎵撴洿缁欏姏鈥?/strong>鈥嬶細鏈変簺鍦烘櫙闇€瑕丏FS+BFS缁勫悎鎷筹紒姣斿鍏堟繁搴︽壘鍙枒鑺傜偣锛屽啀骞垮害缁熻鍏宠仈鏁版嵁銆?/li>
  2. 鈥?strong>鈥嬪苟琛岄亶鍘嗘柊濮垮娍鈥?/strong>鈥嬶細鐢ㄥ绾跨▼鍚屾椂澶勭悊涓嶅悓瀛愭爲锛岄€熷害鐩存帴缈诲€嶏紒馃殌锛堝弬鑰冪綉椤?鐨勭數鍟嗗ぇ鏁版嵁妗堜緥锛?/li>
  3. 鈥?strong>鈥嬪唴瀛樹笉澶熸€庝箞鍔炩€?/strong>鈥嬶細璇曡瘯鈥?strong>鈥嬭帿閲屾柉閬嶅巻鈥?/strong>鈥嬶紒涓嶇敤鏍?闃熷垪锛岀洿鎺ユ敼鎸囬拡锛堥€傚悎楂樻墜鐐妧锛?/li>

馃毃 鏂版墜閬垮潙鎸囧崡

  • 鈥?strong>鈥嬮€掑綊涓嶆槸涓囪兘鑽€?/strong>鈥嬶細瓒呰繃1000灞傜殑浜屽弶鏍戯紵璧剁揣鎹㈣凯浠e啓娉曪紒
  • 鈥?strong>鈥嬭妭鐐硅寰楀垽绌衡€?/strong>鈥嬶細if node.left 姣?if node.left is not None 鏇磒ythonic~
  • 鈥?strong>鈥嬪惊鐜紩鐢ㄦ娴嬧€?/strong>鈥嬶細閬嶅巻鏍戜箣鍓嶆渶濂芥鏌ユ湁娌℃湁鐜舰寮曠敤锛屽惁鍒欐寰幆璀﹀憡锛侌煍?/li>

馃専 璇寸偣蹇冮噷璇?/h3>

骞蹭簡杩欎箞澶氬勾寮€鍙戯紝鍙戠幇鈥?strong>鈥?0%鐨勬爲閬嶅巻bug閮芥槸娌℃兂娓呮璁块棶椤哄簭鈥?/strong>鈥嬶紒涓嬫鍐欎唬鐮佸墠锛屽厛鎷垮紶绾哥敾妫垫爲锛屾爣涓婃暟瀛楁ā鎷熼亶鍘嗚繃绋嬧€斺€旇繖鎷涙瘮debug绠$敤鍗佸€嶏紒

锛堝畬锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载