題目描述
給出一個字符序列,問該序列是否是一棵合法的二叉樹的先序遍歷?
找到一種不需要構造二叉樹的方法。
For example:
“9,3,4,#,#,1,#,#,2,#,6,#,#”
是下面這顆二叉樹的先序遍歷。其中#代表空節點。
分析解答
通過觀察上圖中二叉樹我們可以發現,一棵合法的二叉樹去掉某個葉子節點後仍是合法的二叉樹。在給出的字符序列中,葉子節點有很明顯的特徵,即葉子節點之後一定緊跟兩個空節點#。通過不斷的把number,#,#的子串縮成空節點#(把number,#,#子串替換爲#),如果最後字符序列可以縮短到只有一個字符#,那它就是我們要找的合法的先序遍歷了。
參考程序
class Solution {
public:
bool isValidSerialization(string preorder) {
bool flag = true;
while (preorder.length() > 1) {
int index = preorder.find(",#,#");
if (index < 0) {
flag = false;
break;
}
int start = index;
while (start > 0 && preorder[start-1] != ',')
start--;
if (preorder[start] == '#') {
flag = false;
break;
}
preorder.erase(start, index-start+3);
}
return flag && preorder[0] == '#';
}
};
題目來源
LeetCode 331. Verify Preorder Serialization of a Binary Tree