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