Dropping Balls(滿二叉樹,思維)

2021-10-08 14:52:38 字數 1107 閱讀 5995

uva679 小球下落 dropping balls

題目翻譯:

許多的小球乙個乙個的從一棵滿二叉樹上掉下來組成乙個新滿二叉樹,每一時間,乙個正在下降的球第乙個訪問的是非葉子節點。然後繼續下降時,或者走右子樹,或者走左子樹,直到訪問到葉子節點。

決定球運動方向的是每個節點的布林值。最初,所有的節點都是 false,當訪問到乙個節點時,如果這個節點是 false,則這個球把它變成 true,然後從左子樹走,繼續它的旅程。如果節點是true,則球也會改變它為 false,而接下來從右子樹走。滿二叉樹的標記方法如下圖。

因為所有的節點最初為 false,所以第乙個球將會訪問節點 1,節點 2 和節點 4,轉變節點的布林值後在在節點 8 停止。第二個球將會訪問節點 1、3、6,在節點 12 停止。明顯地,第三個球在它停止之前,會訪問節點 1、2、5,在節點 10 停止。

現在你的任務是,給定新滿二叉樹的深度 d 和下落的小球的編號 i ,可以假定i不超過給定的新滿二叉樹的葉子數,寫乙個程式求小球停止時的葉子序號p。

思路:如果要進行模擬的話,會tle,但是我們找規律可以發現,通過該點的第奇數個小球,會落向該節點的左子樹,反之,則會落向該節點的右子樹,所以我們可以計算當第i個小球落入時,到達每一層節點時,是到達該節點的

第幾個小球,如果是奇數個,就下左子樹,反之,右子樹。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

intmain()

else

}printf

("%d\n"

,k);}}

return0;

}

理解小球下落(Dropping Balls)

直接模擬最後乙個球的過程 演算法競賽入門經典 6.3節樹和二叉樹例題6 6 p236 有一棵二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從上到下從左到右 編號為1,2,3,2d 1。在結點1處放乙個小球,它會往下落。每個內結點上都有乙個開關,初始全部關閉,當每次有小球落到乙個開關上時,狀態...

滿二叉排序樹

對於一棵滿二叉排序樹深度為k,節點數為2 k 1,節點值為1至 2 k 1 給出k和任意三個節點的值,輸出包含該三個節點的最小子樹的根節點值。樣例輸入 4 10 15 13,樣例輸出 12 include iostream include vector include math.h using na...

驗證滿二叉樹

如果一棵二叉樹所有節點都有零個或兩個子節點,那麼這棵樹為滿二叉樹.反過來說,滿二叉樹中不存在只有乙個子節點的節點.更多關於滿二叉樹的資訊可以在這裡找到 滿二叉樹 1 2 3 4 5 不是一棵滿二叉樹 1 2 3 4樣例1 輸入 輸出 true 說明 1 2 3 是一棵滿二叉樹樣例2 輸入 輸出 fa...