回溯法——打印子集树
打印子集樹。比如說有三個元素,用0和1表示子集有或者沒有這個元素,向左分支走為1,向右分支走為0,那么如下圖所有路徑都可以用0和1表示出來,可以用0和1完整表示子集。0就不打印對應的元素,1就打印對應的元素。比如三個元素是{1,2,3}路徑為{0,1,0}的話就打印{2};路徑為{1,1,0}的話就打印{1,2}。
遞歸代碼:
運行結果:
下面我們用非遞歸方法,用回溯法代碼打印子集樹。
先上代碼:
運行結果:
分析:
br數組用1,0表示ar集合的子集和中元素的有無。
比如ar = {1,2,3}
br = {0,0,0}表示ar一個子集不含任何元素
br = {1,0,1}表示ar一個子集含有第一個元素1,和第三個元素3
…
br數組中在代碼循環中可能出現2,2是為了回溯用的,遇到2就回溯。
第一次的時候數組沒有2,i直接走到最后,br = {0,0,0}所以ar子集為空集,什么也沒打印。
第二次的時候打印完空集后,br[2]賦值為1,進入到下一次循環 ,沒有遇到2,不需要回溯,br = {0,0,1},打印。
第三次的時候,第二次打印完后,br[2] += 1,變成2,繼續進入下一次循環,i = 2,br[i] = 2,回溯i–,br[1]被賦值為1,此時br = {0,1,2},進入到下一次循環,將br[2]置為0。br = {1,0,1}打印。
第四次的時候,第三次打印完后,br[2] += 1, 變成1,進入下一次循環,沒遇到2,br = {0,1,1}打印。
第五次的時候,第四次打印完后,br[2] += 1, 變成2,進入下一次循環,回溯i–,br[1]+=1,變成2,繼續回溯,br[0]+=1,變成1,此時br = {1,2,2},i = 0,進入下兩次循環,將2都置為0。br = {1,0,0},打印。
第六次循環的時候,第五次打印完,br[2] += 1,變成1,進入下一次循環,沒有遇到2,沒有回溯,br = {1,0,1},打印。
第七次的時候,第六次打印完,br[2] += 1, 變成2,進入下一次循環,i = 2,br[2] = 2,回溯i–,變為1,br[1] += 1,變為1,進入下一次循環,將br[2]置為0,br = {1,1,0},打印。
第八次的時候,第七次打印完,br[2] += 1,變成1,進入下一次循環,沒有2,br = {1,1,1},打印。
第九次的時候,第八次打印完,br[2] +=1,變成1,進入下一次循環,br[2] = 2,回溯i–,變為1,br[1]+=1,變為2,進入下一次循環,br[1] = 2,回溯i–,變為0,br[0] += 1,變為2,再進入下一次回溯,i–,小于0, 退出循環,結束。
總結
以上是生活随笔為你收集整理的回溯法——打印子集树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并查集(加权规则、折叠规则)
- 下一篇: 回溯法——N皇后问题