解題思路
解題**
解題感悟
難度: 中等
題目:
序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 #。
例如,上面的二叉樹可以被序列化為字串 「9,3,4,#,#,1,#,#,2,#,6,#,#」,其中 # 代表乙個空節點。
給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫乙個在不重構樹的條件下的可行演算法。
每個以逗號分隔的字元或為乙個整數或為乙個表示 null 指標的 『#』 。
你可以認為輸入格式總是有效的,例如它永遠不會包含兩個連續的逗號,比如 「1,3」 。
輸入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
輸出: true
輸入: "1,#"
輸出: false
輸入: "9,#,#,1"
輸出: false
**:力扣(leetcode)
鏈結:
根據二叉樹的特點,乙個二叉樹的節點如果不為空(#),那麼還需要補充兩個節點;而如果為空(#),則可以減少乙個結點。也就是說,遇到數字,當前減少乙個節點,但又增加兩個節點;遇到#,減少乙個節點。
因此可以使用棧的思路,遇到數字則當前棧減少1,同時新增2入棧;遇到#則當前棧減一。如果棧為空則出棧,遍歷後判斷棧是否為空來決定是否滿足條件。第二種方法,因為#減一,而數字則淨增加一,只需乙個計數就可以判斷是否為空了。
class
solution
else
if(preorder[i]
==','
)else
if(preorder[i]
=='#'
)else
stk.
top()--
;if(stk.
top()==
0)stk.
pop();
stk.
push(2
);}}
return stk.
empty()
;}};
class
solution
else
if(preorder[i]
==','
)else
if(preorder[i]
=='#'
)else
slots++;}
}return slots ==0;}};
這題關鍵是理解二叉樹的性質,並善於尋找其中的規律。根據鍵位的特點,空字元則剩餘節點減一,而數字則還需淨節點加一,遍歷整個字串就能求解問題。 力扣每日一題 二叉樹的最小深度
原題鏈結 題目描述 給定乙個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明 葉子節點是指沒有子節點的節點。示例 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回它的最小深度 2.解題思路 dfs即可,只不過注意一下測試用例 1,...
(力扣每日一題)不同的二叉搜尋樹 II
二叉搜尋樹有以下幾個特點 1 左邊的小於當前 2 右邊的大於當前 3 沒有重複的值。為了符合二叉搜尋樹的這幾個特點,我們需要知道當前的範圍。要知道開頭和結尾 最開始是1和n 1 首先定義乙個字典儲存已遍歷的引數和結果以免重複。2 特殊情況判斷 如果n 0,返回,如果不判斷則會返回 none 執行遞迴...
每日一題 重建二叉樹
題目 輸入某二叉樹的先序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的先序遍歷和中序遍歷的結果中都不含重複的數字。例如 前序遍歷序列 1,2,4,7,3,5,6,8 和中序遍歷序列 4,7,2,1,5,3,8,6 重建出下圖所示的二叉樹並輸出它的頭結點。param preorder 先序遍歷 p...