力扣每日一題 331 驗證二叉樹的前序序列化

2021-10-21 20:34:21 字數 1626 閱讀 9083

解題思路

解題**

解題感悟

難度: 中等

題目

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 #。

例如,上面的二叉樹可以被序列化為字串 「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...