原文首發自拿人口統計作為例子,遍曆法與分治法的區別如下:
人口普查員自己乙個人帶著乙個本子,跑遍全中國挨家挨戶的敲門查戶口
國家統計局的老闆想要知道全國人口的總數,於是他找來全國各個省的統計局領導,下派人口普查任務給他們,讓他們各自去統計自己省的人口總數。在老闆
這兒,他只需要最後將各個省匯報的人口總數結果累加起來,就得到了全國人口的數目。
然後每個省的領導,又找來省裡各個市的領導,讓各個市去做人口統計。
市找縣,縣找鎮,鎮找鄉。最後鄉里的幹部挨家挨戶敲門去查戶口。
在這裡,把全國的任務拆分為省級的任務的過程,就是分治法中分的這個步驟。把各個小任務派發給別人去完成的過程,就是分治法中
治的這個步驟。但是事實上我們還有第三個步驟,就是將小任務的結果合併到一起的過程,合這個步驟。因此如果我來取名字的話,我會叫這個演算法:分治合演算法。
聯絡分治法與遍曆法是兩種常見的遞迴方法。
分治法解決問題的思路
先讓左右子樹去解決同樣的問題,然後得到結果之後,再集成為整棵樹的結果。
遍曆法解決問題的思路
通過前序/中序/後序的某種遍歷,遊走整棵樹,通過乙個全域性變數或者傳遞的引數來記錄這個過程中所遇到的點和需要計算的結果。
兩種方法的區別
從程式實現角度分治法的遞迴函式,通常有乙個返回值,遍曆法通常沒有
遞迴與遞迴對應的是迭代。
遞迴可以從兩個層面來理解:
演算法層面,是一種由大化小、由小化無的思想
程式實現層面,是函式自己呼叫自己的一種方式 搜尋
搜尋分為深度優先搜尋dfs和寬度優先搜尋bfs,搜尋是一種類似於列舉的演算法,(當我們知道陣列的範圍和大小時)。
通常,bfs 不用遞迴,dfs 需要遞迴。
回溯回溯是深度優先搜尋過程中的乙個步驟。
原文首發自
迭代法後序遍歷二叉樹 和 Morris遍曆法
首先宣告乙個棧 stack 若root有左子樹,root入棧,root root.left,直到root為空,彈出棧頂元素並將其賦值給root 若root沒有右子樹或右子樹已經被訪問,則訪問root節點,用pre記錄root,然後root賦值null 注意 只有訪問root節點時才更新pre節點 若...
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
二叉樹的建立與遍歷 二叉樹遍歷模板)
初學二叉樹,感覺之前鍊錶掌握不熟練導致接受有點難,現在做一些總結。本題其實就是根據給出的前序遍歷 包括空子樹 寫出相應的前序 中序和後序遍歷。廢話不多說,先看看題目 description 下面給出了教材中演算法6.4所示的演算法。status createbitree bitree t retur...