給定一棵二叉樹,節點值為 0-9。每條從根到葉的路徑代表一個數字(如 1→2→3 代表 123)。求所有這樣數字之和。
int sumNumbers(TreeNode* root) {
function dfs = [&](TreeNode* node, int cur) {
if (!node) return 0;
cur = cur * 10 + node->val;
if (!node->left && !node->right) return cur;
return dfs(node->left, cur) + dfs(node->right, cur);
};
return dfs(root, 0);
}
時間 O(n),空間 O(h)(遞歸棧,h 為樹高)。
int sumNumbers(TreeNode* root) {
if (!root) return 0;
int ans = 0;
stack> st;
st.emplace(root, root->val);
while (!st.empty()) {
auto [node, cur] = st.top(); st.pop();
if (!node->left && !node->right) ans += cur;
if (node->right) st.emplace(node->right, cur * 10 + node->right->val);
if (node->left) st.emplace(node->left, cur * 10 + node->left->val);
}
return ans;
}
int sumNumbers(TreeNode* root) {
if (!root) return 0;
queue> q;
q.emplace(root, root->val);
int ans = 0;
while (!q.empty()) {
auto [node, cur] = q.front(); q.pop();
if (!node->left && !node->right) ans += cur;
if (node->left) q.emplace(node->left, cur * 10 + node->left->val);
if (node->right) q.emplace(node->right, cur * 10 + node->right->val);
}
return ans;
}
new_val = old_val * 10 + node->val。!left && !right。long long 防溢出。