有兩位極客玩家參與了一場「二叉樹著色」的遊戲。遊戲中,給出二叉樹的根節點 root,樹上總共有 n 個節點,且 n 為奇數,其中每個節點上的值從 1 到 n 各不相同。
遊戲從「一號」玩家開始(「一號」玩家為紅色,「二號」玩家為藍色),最開始時,
「一號」玩家從 [1, n] 中取乙個值 x(1 <= x <= n);
「二號」玩家也從 [1, n] 中取乙個值 y(1 <= y <= n)且 y != x。
「一號」玩家給值為 x 的節點染上紅色,而「二號」玩家給值為 y 的節點染上藍色。
之後兩位玩家輪流進行操作,每一回合,玩家選擇乙個他之前塗好顏色的節點,將所選節點乙個 未著色 的鄰節點(即左右子節點、或父節點)進行染色。
如果當前玩家無法找到這樣的節點來染色時,他的回合就會被跳過。
若兩個玩家都沒有可以染色的節點時,遊戲結束。著色節點最多的那位玩家獲得勝利 ✌️。
現在,假設你是「二號」玩家,根據所給出的輸入,假如存在乙個 y 值可以確保你贏得這場遊戲,則返回 true;若無法獲勝,就請返回 false。
這個題目和一般的二叉樹的題目不一樣。一般的題目可以使用那個二叉樹的遞迴套路或者dfs或者bfs去解決。這個題目需要進一步的思考
思路比較簡單: 先找到 x 所在的位置 x_root, 然後統計 x_root 的左子樹,右子樹和父節點的另一子樹的節點個數。如果這三個方向上有任何一棵子樹的節點個數超過了節點總數的一半,則必定存在乙個必勝的策略
1.分析題,x選定之後,y每當選定乙個節點之後,在y背離x方向一層的節點就不再會被x染色到,也就是提示所說的,y選在**,就會堵住一條道路;
2.所以最好的方式就是,y貼著x選,這樣能最早的堵住x發展下去的一條道路,那麼貼著x選最多有三個節點,x的左右孩子節點,x的父節點,所以可以統計出x的左右孩子子樹分別包含多少個節點,那麼根據總節點數就可以得到x父節點往上的總節點數;
3.最後y選擇節點數最多的一路來堵住x,如果這一路的節點數比x可以發展的另外兩條路的節點數都多,那麼y就找到了乙個可以贏的位置
public treenode findx
(treenode root,
int x)
treenode t1 = null;
treenode t2 = null;
if(root.left!=null)
if(root.right!=null)
if(t1==null)
else
}public
intnums
(treenode root)
int a1 =
nums
(root.left)
;int a2 =
nums
(root.right)
;return a1+a2+1;
}public
boolean
btreegamewinningmove
(treenode root,
int n,
int x)
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...