July之題目--“微軟亞洲研究院”

題目出處:http://blog.csdn.net/v_JULY_v/article/details/6313257

題目:

假設有一顆二叉樹,已知這棵樹的節點上不均勻的分佈了若干石頭,石頭數跟這棵二叉樹的節點數相同,石頭只可以在子節點和父節點之間進行搬運,每次只能搬運一顆石頭。請問如何以最少的步驟將石頭搬運均勻,使得每個節點上的石頭上剛好爲1。


我的思路:
1.程序所需數據結構:構造一棵和原二叉樹骨骼相同的二叉樹(不妨叫:仿造二叉樹),仿造二叉樹中每個節點只存儲以下信息:
   信息 #1:原二叉樹中以相應節點爲根的子二叉樹的節點總數和所包含的石頭總數的差值。
2.程序執行過程,三次遍歷二叉樹:
   遍歷#1:後序遍歷兩棵二叉樹,在訪問原每一個節點的時候分兩種情況:
                 情況#1:如果該節點是葉子節點,則將該節點的石頭個數減去1的結果保存到仿造二叉樹的相應節點中。
                 情況#2:如果不是葉子節點,則將該節點的石頭個數減去1,然後再加上其子女節點的數值的結果保存到仿造二叉樹的相應節點中。
                 結果#1:仿造二叉樹的每個節點中包含上述1中的信息#1.
                 結果#2:仿造二叉樹的根節點中保存的結果值一定爲0,因爲原二叉樹節點的個數與石頭的個數相同。
    遍歷#2:後序遍歷兩棵二叉樹,在訪問仿造二叉樹每個節點的時候分爲兩種情況:
                 情況#1:如果該節點的值小於等於0,則不做任何處理。
                 情況#2:如果該節點的值n大於0,且兩個子女節點的值爲n1,n2(葉節點的值爲0),則如果n+n1+n2的值大於0,將n+n1+n2個石頭從原節點的相應節點移動到其父節點。
                  結果#1:也是很重要的一個結果:每棵子樹都已經達到了內部平衡,即節點個數等於石頭個數。
   遍歷#3:先序遍歷兩棵二叉樹,在遍歷仿造二叉樹的每個節點的時候,如果該節點的值n大於0,就將原二叉樹中相應節點上的n個石頭移動到值小於0的子女節點上。

優化:
1.將“信息#1”存入原二叉樹中,並且在每個節點中增加一個c,代表以該節點爲根的子樹的平衡度(石頭總數減去節點總數)。
2.將“遍歷#1”和“遍歷#2”合併爲一次後續遍歷。
    結果#1:每棵子樹的根節點保存有該子樹的平衡度c,而且c肯定小於或者等於0,而且整棵樹的根節點的c肯定等於0.





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章