漢諾塔與二叉樹

2021-05-22 11:42:22 字數 2293 閱讀 7174

我相信很多朋友都知道漢諾塔問題,也有不少看過了它的程式實現,但我想有不少人不懂它是什麼意思,為什麼那幾行程式就把漢諾塔問題給解了呢?

先囉嗦一會兒。解釋一下。。。

漢諾塔是源自印度神話裡的玩具。

上帝創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上安大小順序摞著64片**圓盤。

上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今還在一刻不停地搬動著圓盤。

漢諾塔與宇宙壽命  如果移動乙個圓盤需要1秒鐘的話,等到64個圓盤全部重新落在一起,宇宙被毀滅是什麼時候呢?

讓我們來考慮一下64個圓盤重新摞好需要移動多少次吧。1個的時候當然是1次,2個的時候是3次,3個的時候就用了7次......這實在是太累了

因此讓我們邏輯性的思考一下吧。

4個的時候能夠移動最大的4盤時如圖所示。

到此為止用了7次。

接下來如下圖時用1次,在上面再放上3個圓盤時還要用7次(把3個圓盤重新放在一起需要的次數)。

因此,4個的時候是

「3個圓盤重新摞在一起的次數」+1次+「3個圓盤重新摞在一起需要的次數」

=2x「3個圓盤重新摞在一起的次數」+1次

=15次。

那麼,n個的時候是

2x「(n-1)個圓盤重新摞在一起的次數」+1次。

由於1 個的時候是1次,結果n個的時候為(2的n次方減1)次。

1個圓盤的時候 2的1次方減1

2個圓盤的時候 2的2次方減1

3個圓盤的時候 2的3次方減1

4個圓盤的時候 2的4次方減1

5個圓盤的時候 2的5次方減1

n個圓盤的時候 2的n次方減1

也就是說,n=64的時候是(2的64次方減1)次。

因此,如果移動乙個圓盤需要1秒的話,

宇宙的壽命=2的64次方減1(秒)

2的64次方減1到底有多大呢?動動計算器,答案是乙個二十位的數字:

用一年=60秒x60分x24小時x365天來算的話,大約有5800億年吧。

據說,現在的宇宙年齡大約是150億年,還差得遠呢。

漢諾塔問題在數學界有很高的研究價值,

而且至今還在被一些數學家們所研究,

也是我們所喜歡玩的一種益智遊戲,

它可以幫助開發智力,激發我們的思維。

漢諾塔的c語言實現

#include

void move(char x,char y)

printf("%c-->%c/n",x,y);

void hanoi(int n,char one ,char two,char three)

if(n==1) move(one,three);

else

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

main()

int m;

printf("input the number of disks:");

scanf("%d",&m);

printf("the step to moving %3d diskes:/n",m);

hanoi(m,'a','b','c');

hanoi(n-1,one,three,two);

hanoi(n-1,two,one,three);

我們知道它用了遞迴,第一句把第乙個位置的盤移到第二個位置,第二句再把第二個移到第三個位置。 但為什麼這樣就可以遞迴出答案呢?

這個可以用二叉樹的中序遍歷來解釋。下面看乙個圖估計你就會知道了。

這是乙個遞迴的**,根結點是第一次進入hanoi函式,第乙個引數3只要大於1就往下推,第二個引數是指要移動的盤的原始位置(最上面的那個),第四個引數是指要移動到的目的位置,第三個引數在函式裡面沒什麼用,只是為了下一次遞迴時準備的乙個引數。這個圖是按照程式畫出來的,上面的節點個數就是呼叫hanoi函式的次數。現在我們來中序遍歷這棵二叉樹。

假設:開始時a,b,c三個盤都放在one上,從a到c依次增大,就是說c放在最下面,a在最上面,->表示移動。

節點4:a->three

節點2:b->two

節點5:a->two

節點1:c->three

節點6:a->one

節點3:b->three

節點7:a->three

完成。。。

假設有4個盤呢?那也是一樣的道理可以推出。這時就有15個節點,就是說要移動15次。那有n個盤呢?2的n次方減1……

二叉樹與漢諾塔

去年考研學習過程中,看過郝斌的資料結構入門 講的挺好的 當時看過二叉樹的遍歷時,發現,其實漢諾塔的移動軌跡可以表示為二叉樹的中序遍歷路徑,當時一直想寫文章記下來,然後拖到現在。資料結構中的一種,每個結點最多有兩個子結點的樹結構。其中左子結點下面的子樹為左子樹,右子點結點的為右子樹。二叉樹的遍歷是按照...

漢諾塔(二) 思維

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述漢諾塔的規則這裡就不再多說了,詳見題目 漢諾塔 一 現在假設規定要把所有的金片移動到第三個針上,給你任意一種處於合法狀態的漢諾塔,你能計算出從當前狀態移動到目標狀態所需要的最少步數嗎?輸入第一行輸入乙個整數n,表示測試資料的組數 ...

合併二叉樹 漢明距離 翻轉二叉樹

合併二叉樹 617合併二叉樹 definition for a binary tree node.struct treenode class solution else 同上 if t1 right null t2 right null else return t1 treenode mergetr...