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,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫乙...