Google 2016 面試題2 | 不構造樹的情況下驗證先序遍歷

題目描述

給出一個字符序列,問該序列是否是一棵合法的二叉樹的先序遍歷?
找到一種不需要構造二叉樹的方法。
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章