331 驗證二叉樹的前序序列化

2021-10-21 21:45:57 字數 1824 閱讀 7599

leercode題目:331. 驗證二叉樹的前序序列化

因此我們可以寫出如下ac**:

class solution 

int pos = 0;

return dfs(preorder, pos) && pos >= n;

}bool dfs(string &s, int &pos)

if (s[pos] == '#')

while (pos < n && isdigit(s[pos]))

pos ++;

if (!dfs(s, pos))

if (!dfs(s, pos))

return true;

}};

執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00%的使用者

記憶體消耗:6.5 mb, 在所有 c++ 提交中擊敗了96.69%的使用者

圖的入度等於出度,樹可以看成一種特殊的圖。因此,樹的出度也應該和出度相等。

也就是說命題p:如果乙個序列可以表示成一棵二叉樹,那麼這顆二叉樹的入度等於出度。是真的。

那麼p的逆否命題q:如果乙個序列的出度不等於入度,那麼這個序列不能表示成一顆二叉樹。是真的。

但是,p的逆命題:如果乙個序列的出度等於入度,那麼這個序列是合法的。這個命題為真麼?

如果序列是這樣的:

1

/ \# #

/\

2 #

那麼,顯然,這個序列是不合法的。

仔細觀察,不難發現,我們在遍歷過程中,如果序列合法,一定存在出度大於等於入度這個條件。

因此,我們結合一下,便可以寫出ac**:

class solution 

int indegree = 0;

int outdegree = 2;

int pos = 1;

while (pos < n)else if (preorder[pos] == ',')else

indegree ++;

outdegree += 2;

}if (indegree == outdegree)

}return indegree == outdegree;

}};

執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00%的使用者

記憶體消耗:6.5 mb, 在所有 c++ 提交中擊敗了96.10%的使用者

可以寫出ac**:

class solution 

stackstk;

int pos = 1;

stk.push(2);

while (pos < n)

if (preorder[pos] == ',')else if(preorder[pos] == '#')

pos ++;

}else

stk.top() -= 1;

if (!stk.top())

stk.push(2);}}

return stk.empty();

}};

執行用時:0 ms, 在所有 c++ 提交中擊敗了100.00%的使用者

記憶體消耗:6.8 mb, 在所有 c++ 提交中擊敗了70.96%的使用者

空間複雜度優化:

2021.3.12 23:44

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 9 3 2 4 1 6 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二...

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 9 3 2 4 1 6 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二...

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫乙...